1. 程式人生 > >poj 2406 KMP求迴圈節

poj 2406 KMP求迴圈節

#include <iostream>
#include <cstdio> 
#include <algorithm>
#include <cstring>
using namespace std;
const int M =10000100;
char s[M];
int fail[M];
int len;
void Fail()
{
	int i=0,k=-1;
	len=strlen(s);
	fail[0]=-1;
	while(i<len)
	{
		if(k==-1||s[i]==s[k])
		{
			fail[i+1]=k+1;
			i++;
			k++;
		}
		else
		{
			k=fail[k];
		}
	}
	

}
int main()
{
	while(scanf("%s",s)!=EOF&&s[0]!='.')
	{
		Fail();
		int ans=1;
		
		// 123456
		// 若fail[len]=5   ->  1234=3456   56=34 34=12
		
		 
		// len-fail[len] 錯位部分即為迴圈節部分 
		
		if(len%(len-fail[len])==0)
		ans=len/(len-fail[len]);
		
		cout<<ans<<endl;
		
	}
	return 0;
}