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;

}

 

你可能感兴趣的:(HDU)