题意: (题目来源:洛谷) 解题思路: 前面说了最小周期是n-nxt[n]那么只要对nxt[n]一直求nxt即可,知道nxt等于0 AC代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e6 + 10; string s; int nxt[maxn]; void getnxt(string s, int *nxt) { int l = s.size(), i = 0, j = -1; nxt[i] = j; while (i < l) { if (j == -1 || s[i] == s[j]) { i++, j++, nxt[i] = j; if (nxt[j] && j) nxt[i] = nxt[j]; //为了加快第27行的步骤 } else j = nxt[j]; } } int l; //因为是求题目所定义的最大周期之和,所以每个长度len,都一直求到nxt[]==-1为止,然后只要在getnxt加快步骤就行了 int main() { cin >> l >> s; getnxt(s, nxt); ll ans = 0; for (int i = 1; i <= l; i++) { int tt = nxt[i]; if (!tt) continue; while (nxt[tt] != 0) tt = nxt[tt]; int j = i - tt; if (j == i) continue; ans += j; } cout << ans << endl; }