【题目链接】
【思路要点】
- 补档博客,无题解。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 500005 int len[MAXN], n; char s[MAXN]; int main() { scanf("%d\n%s", &n, s + 1); int home = 0, pos = -1; for (int i = 2; i <= n; i++) { if (s[i] == s[i - 1]) continue; if (i > pos) { while (i + len[i] <= n && i - len[i] - 1 > 0 && s[i + len[i]] != s[i - len[i] - 1]) len[i]++; home = i; pos = i + len[i] - 1; } else { int p = 2 * home - i; if (i + len[p] - 1 < pos) len[i] = len[p]; else { len[i] = pos - i + 1; while (i + len[i] <= n && i - len[i] - 1 > 0 && s[i + len[i]] != s[i - len[i] - 1]) len[i]++; home = i; pos = i + len[i] - 1; } } } long long ans = 0; for (int i = 1; i <= n; i++) ans += len[i]; printf("%lld\n", ans); return 0; }