题目 https://cn.vjudge.net/problem/POJ-2406
题意
用next数组求出整个数组的最大前缀,如果整个串是用循环节组成的,那么 n - next[n] 也就是最小循环节,验证最小循环节会被n整出。
思路
利用KMP算法,求字符串的特征向量next,若len可以被len - next[len]整除,则最大循环次数n为len/(len - next[len]),否则为1。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int nex[1000005];
char s[2000006];
void kmpNext(char *p)
{
int t = nex[0] = -1;
int n =strlen(p);
int j = 0;
while(j<n)
{
if(t== -1||p[t]==p[j])
{
j++;
t++;
nex[j] = t;
}
else
t = nex[t];
}
}
int main()
{
while(scanf("%s",s) != EOF)
{
if(s[0] == '.')
{
break;
}
memset(nex,0,sizeof(nex));
kmpNext(s);
int len = strlen(s);
if(len%(len - nex[len]) == 0)
{
printf("%d\n",len/(len-nex[len]));
}
else
printf("1\n");
}
return 0;
}
本文探讨了如何使用KMP算法求解字符串的next数组,通过分析next数组找到字符串的循环节,进而判断整个字符串是否由重复的循环节组成。通过实例讲解了如何实现这一过程,并提供了完整的代码示例。
623

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



