#include <stdio.h>
#include <string.h>
#define min(a,b) ((a)<(b)?(a):(b))
/*
abcd
aaaa
ababab
.
题意: 求最小循环节的个数
思路:KMP ,最小循环节 = n-next[n]
*/
const int N = 1000005;
char b[N];
int next[N];//注意
int len;
void getNext()
{
int j=-1;next[0]=-1;
for(int i=1;i<len;i++)
{
while(j>=0 && b[i]!=b[j+1])
j=next[j];
if(b[i]==b[j+1])
j++;
next[i]=j;
}/*
for(int i=0;i<lenc;i++)
printf("%d ",next[i]);
printf("\n");*/
}
int solve()
{
int k=len-next[len-1]-1;//最小循环节的长度
if(k==0) return 1;
if(len%k==0 ) return len/k;
else return 1;
}
int main()
{
while(~scanf("%s",b) && b[0]!='.')
{
len=strlen(b);
getNext();
printf("%d\n",solve());
}
return 0;
}
字符串 KMP POJ 2406
原文作者:KMP算法
原文地址: https://blog.csdn.net/DouBoomFly/article/details/52170488
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/DouBoomFly/article/details/52170488
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。