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;
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM