题目来源:BZOJ 1355
思路:
求循环节用到KMP的fail数组的性质。
试想一个长度为n的字符串,fail数组是后缀与前缀相同的最长的长度,那么最短的循环节是不能匹配的,长度为
n−fail[n]
。
代码:
#include <cstdio>
const int maxn = 1000010;
int f[maxn], n, p;
char a[maxn];
int main(){
scanf("%d%s", &n, a+1);
p = 0;
for(int i = 2; i <= n; i ++){
while(p && a[p+1] != a[i]) p = f[p];
if(a[p+1] == a[i]) p ++;
f[i] = p;
}
printf("%d", n-f[n]);
return 0;
}