奥赛一本通 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;
}

浙公网安备 33010602011771号