比赛 期末考试0 评测结果 WAAAAWWEEE
题目名称 Sayaku,移动 最终得分 40
用户昵称 赵飞羽 运行时间 0.476 s
代码语言 C++ 内存使用 3.66 MiB
提交时间 2026-02-07 11:21:13
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int N = 2010;
int n, t[N*N], len, ans, tot, siz;
string s;

void dfs(int pos) {
    if (len >= n) return;
    int x = s[len] - '0';
    t[pos] = x + 1;
    if (x == 0) return;
    else if (x == 1) {
        len++;
        dfs(pos*2);
    } else if (x == 2) {
        len++;
        dfs(pos*2+1);
    } else {
        len++;
        dfs(pos*2);
        len++;
        dfs(pos*2+1);
    }
}

void _find(int pos) {
    if (!t[pos]) {
        siz--;
        return;
    } else if (!t[pos*2] && !t[pos*2+1]) {
        return;
    } else {
        siz++;
        _find(pos*2);
        siz++;
        _find(pos*2+1);
    }
}

int main() {
    freopen("movement.in", "r", stdin);
    freopen("movement.out", "w", stdout);
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> s;
    n = s.size();
    if (s[n-1] == '0') {
        for (int i = 0; i < n; i++) {
            if (i == n - 1) {
                cout << 1;
                return 0;
            }
            if (s[i] != '1') {
                break;
            }
        }
    }
    dfs(1);
    for (int i = 1; t[i]; i *= 2) {
        siz = 1;
        _find(i*2+1);
        ans = max(siz*2+1, ans);
    }
    for (int i = 1; t[i]; i = i * 2 + 1) {
        siz = 1;
        _find(i*2);
        tot = max(siz*2+1, tot);
    }
    cout << min(ans, tot);
    return 0;
}