#include <bits/stdc++.h>
const int N = 2e6 + 5;
int n, head[N]; // head 表示以该字符结尾的最短可消除字符串的首位
long long ans, res[N]; // res 表示以该字符结尾的可消除字符串数量
char s[N];
int main() {
scanf("%d%s", &n, s + 1);
for (int i = 2; i <= n; i++) {
if (s[i - 1] == s[i]) { // 与前一字符配对
head[i] = i - 1;
res[i] += res[i - 2] + 1;
} else if (head[i - 1] > 1 && s[head[i - 1] - 1] == s[i]) { // 带上前一字符可配对
head[i] = head[i - 1] - 1;
res[i] += res[head[i - 1] - 2] + 1;
}
}
for (int i = 1; i <= n; i++) {
ans += res[i];
}
printf("%lld\n", ans);
return 0;
}
如题,题目为 CSP-S 2023 T2,上述代码在 n 较大时答案误差也较大,求教哪里有考虑不周的地方…