ans=n-fail[n]
KMP想一想,解题不烦恼
然而并没有什么卵用,先粘一个错误代码吧
【为什么MarkDown编辑器的代码字体这!么!丑!虽然很好用(鱼与熊掌不可得兼)】
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define red(i, a, b) for(int i = (a); i <= (b); i++)
#define ll long long
const int maxn = 1001000;
char a[maxn];
int n;
int f[maxn];
void getfail(char* P, int* f){
int m = strlen(P);
f[0] = 0, f[1] = 0;
rep(i, 1, m-1) {
int j = f[i];
while(j && P[i]!=P[j]) j = f[j];
f[i+1] = P[i] == P[j] ? j+1 : 0;
}
}
int main() {
scanf("%d", &n);
char ch = getchar();
scanf("%s", a);
getfail(a, f);
if (f[n-1] == 0) printf("%d\n", n);
else printf("%d\n", n-1-f[n-1]);
return 0;
}