奥赛一本通 1462 Antisymmetry

1462 Antisymmetry

题目大意

如果一个 01 串取反后,再倒过来和原串一样,就称作反对称字符串。求一个 01 串的反对称子串数量。

知识要点

Manacher

解题思路

如果把两个不同的字符视作匹配,那么反对称字符串就相当于长度为偶数的回文串,使用 Manacher 算法即可求解。

参考代码

#include <bits/stdc++.h>
using namespace std;

char s[500005];
int d[500005]; //最长对称半径 
int main() {
    int n, l = 0, r = 0; //[l,r) 维护当前最靠右的对称区间 
    scanf("%d%s", &n, s);

    long long ans = 0;
    for(int i = 1; i < n; i++) {
        if(i < r) d[i] = min(d[l + r - i], r - i);
        while(0 < i - d[i] && i + d[i] < n && s[i + d[i]] != s[i - 1 - d[i]]) d[i]++;
        ans += d[i];
        if(i + d[i] > r) l = i - d[i], r = i + d[i];
    }
    printf("%lld\n", ans);
    return 0;
}
posted @ 2026-09-22 14:50  萧西待水  阅读(6)  评论(0)    收藏  举报