题目来源: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;
}

本文介绍如何使用KMP算法中的fail数组特性来寻找给定字符串的最短循环节。通过具体代码实现展示了如何计算fail数组并找到长度为n的字符串的最短循环节。
390

被折叠的 条评论
为什么被折叠?



