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