1. 程式人生 > >poj2406 kmp 最小重複子串

poj2406 kmp 最小重複子串

這個題就是利用kmp的next函式,求組成主串的最小重複子串的長度。

如果字串下標從1開始的話,字串長度len

(1)若len mod ( len - next[len] ) = 0 那麼a[next[len]+1...len] 就是最小重複的子串

(2)若len mod ( len - next[len] ) !=0 那麼最小重複子串為字串本身

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;

const int maxn=1000001;
int n;
int fail[maxn];
char a[maxn];

void kmp()
{
	int i,j;
	j=-1;
	memset(fail,-1,sizeof(fail));
	for(i=1;i<n;i++)
	{
		while(j>-1 && a[j+1]!=a[i]) j=fail[j];
		if(a[j+1]==a[i]) j++;
		fail[i]=j;
	}
}

int main()
{
	while(scanf("%s",&a))
	{	
		if(a[0]=='.') break;
		n=strlen(a);
		kmp();
		if(n%(n-1-fail[n-1])==0) cout<<n/(n-1-fail[n-1])<<endl;
		else cout<<1<<endl;
	}
	return 0;
}