题目链接: poj 2406
题目大意: 给出一个由某个串重复有限次得到的字符串
求重复次数最多是多少,既找出最小重复子串
解题思路: 字符串abcabcabc的next[ ]值为
0 1 2 3 4 5 6 7 8 9
a b c a b c a b c
-1 0 0 0 1 2 3 4 5 6
假设主串为abcabcabcX,模式串为abcabcabcK,Kmp的匹配过程
匹配到第10个字符发现不符:
a b c a b c a b c X
a b c a b c a b c K
不符合,j=next[j]
a b c a b c a b c X
a b c a b c a b c K
不符合,j=next[j]
a b c a b c a b c X
a b c a b c a b c K;
由next数组的定义可得: S[0-2]=S[3-5]=S[6-8]
当且仅当len%(len-next[len])=0时,len-next[len]是字符串的最小循环节
代码:
#include <stdio.h>
#include <string.h>
#define MAX 1000005
char ch[MAX];
int next[MAX];
int Get_next(int Tlen)
{
int i=0,j=-1;
next[0]=-1;
while(i<Tlen)
{
if(j==-1||ch[i]==ch[j])
{
i++; j++;
next[i]=j;
}
else
j=next[j];
}
i=Tlen-j; //**
if(Tlen%i==0) //**
return Tlen/i; //**
return 1;
}
int main()
{
int Tlen;
while(scanf("%s",ch)!=EOF)
{
if(ch[0]=='.')
break;
Tlen=strlen(ch);
printf("%d\n",Get_next(Tlen));
}
return 0;
}