poj2406(kmp循环节)

http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10758

思路:KMP,next表示模式串如果第i位(设str[0]为第0位)与文本串第j位不匹配则要回到第next[i]位继续与文本串第j位匹配。则模式串第1位到next[n]与模式串第n-next[n]位到n位是匹配的。所以思路和上面一样,如果n%(n-next[n])==0,则存在重复连续子串,长度为n-next[n]。

例如:a    b    a    b    a    b

next:-1   0    0    1    2    3    4

next[n]==4,代表着,前缀abab与后缀abab相等的最长长度,这说明,ab这两个字母为一个循环节,长度=n-next[n];

#include<iostream>

#include<string.h>

using namespace std;

int next[1000005];

char s[1000005];

void getnext()

{

	int i=0,j=-1;

	next[0]=-1;

	int len=strlen(s);

	while(i<len)

	{

		if(s[i]==s[j]||j==-1)

		{

			i++;

			j++;

			next[i]=j;

		}

		else

			j=next[j];

	}

}

int main()

{

	while(scanf("%s",s)>0)

	{

		if(s[0]=='.')

			break;

		int len=strlen(s);

		getnext();

		if(len%(len-next[len])==0)

			printf("%d\n",len/(len-next[len]));

		else

			printf("1\n");

	}

	return 0;

}

 

你可能感兴趣的:(poj)