1 条题解

  • 0
    @ 2025-3-24 17:33:38
    #include <bits/stdc++.h>
    using namespace std;
    typedef unsigned long long ull;
    int n;
    ull x[500005];
    ull sum[500005], sum2[500005], power[500005], b = 29, ans;
    ull a[500005];
    char c;
    bool check(int s, int t) {
        ull o = sum[s + t] - sum[s - t] * power[2 * t];
        ull p = sum2[n - s + t] - sum2[n - s - t] * power[2 * t];
    
        if (o + p == x[2 * t])
            return true;
        else
            return false;
    }
    int main() {
        scanf("%d", &n);
    
        for (int i = 1; i <= n; i++) {
            cin >> c;
    
            if (c == '0')
                a[i] = 0;
            else
                a[i] = 1;
        }
    
        power[0] = 1;
        x[0] = 0;
    
        for (int i = 1; i <= 500000; i++) {
            power[i] = b * power[i - 1];
            x[i] = x[i - 1] * b + 1;
        }
    
        for (int i = 1; i <= n; i++) {
            sum[i] = b * sum[i - 1] + a[i];
            sum2[i] = b * sum2[i - 1] + a[n + 1 - i];
        }
    
        for (int i = 1; i <= n - 1; i++) {
            int l = 1, r = min(i, n - i);
    
            while (l <= r) {
                int mid = (l + r) / 2;
    
                if (check(i, mid))
                    l = mid + 1;
                else
                    r = mid - 1;
            }
    
            ans += r;
        }
    
        printf("%lld", ans);
        return 0;
    }
    
    • 1

    信息

    ID
    918
    时间
    1000ms
    内存
    512MiB
    难度
    (无)
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者