hdu1358(kmp循环节)

http://acm.hdu.edu.cn/showproblem.php?pid=1358

#include<iostream>
#include<string.h>
using namespace std;
#define M 1000005
int next[M];
char s[M];
void getnext()
{
	int i=0,j=-1;
	next[0]=-1;
	int len=strlen(s);
	while(i<len)
	{
		if(j==-1||s[i]==s[j])
		{
			i++;
			j++;
			next[i]=j;
		}
		else
			j=next[j];
	}
}
int main()
{
	int text=0,n;
	while(scanf("%d",&n)>0&&n)
	{
		scanf("%s",s);
		getnext();
		printf("Test case #%d\n",++text);
		int i,j=0;
		int len=strlen(s);
		for(i=1;i<len;i++)
		{
			if(next[i+1]!=0&&(i+1)%(i+1-next[i+1])==0)
			{
				printf("%d %d\n",i+1,(i+1)/(i+1-next[i+1]));
			}
		}
		printf("\n");
	}
	return 0;
}

 

posted @ 2013-01-02 19:38  紫忆  阅读(212)  评论(0编辑  收藏  举报