题目大意:
解题思路:
https://blog.csdn.net/The_OIer/article/details/102768137
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 10;
string s;
int nxt[maxn], dp[maxn], p[maxn];
void getnxt() {
int l = s.size(), i = 0, j = -1;
nxt[0] = -1;
while (i < l) {
if (j == -1 || s[i] == s[j]) i++, j++, nxt[i] = j;
else j = nxt[j];
}
}
//引理1.4那块地方的f[nxt[i]]覆盖f[i]可能是会有多出来的,但是没有关系,因为多出来的又能跟后面的重叠
int main() {
cin >> s;
getnxt();
int l = s.size();
for (int i = 1; i <= l; i++) dp[i] = i;
p[1] = 1;
for (int i = 2; i <= l; i++) {
if (i - nxt[i] <= p[dp[nxt[i]]] && p[dp[nxt[i]]] < i)
dp[i] = dp[nxt[i]];
p[dp[i]] = i;
}
cout << dp[l] << endl;
}