hdu1358 Period

        题意:输入一个串,在它的所有前缀中,如果出现了周期串,输出周期串的长度和重复次数。

        思路:KMP算法。这应该算是KMP算法next数组的一个应用。一个周期串,假设长度为len,周期长为p,那么它的前len-p个字符和后len-p个字符肯定是完全一样的。这样就可以利用next数组的性质求解。


#include <iostream>      
#include <stdio.h>      
#include <cmath>      
#include <algorithm>      
#include <iomanip>      
#include <cstdlib>      
#include <string>       
#include <vector>      
#include <queue>      
#include <stack>      
#include <map>    
#include <set>    
#include <string.h>
#include <ctype.h>      
  
using namespace std;    

char str[1000010];
int next[1000010];

int main(){
	int n;
	int cas=0;
	while(cin>>n){
		cas++;
		if(!n)break;
		memset(next,0,sizeof(next));
		scanf("%s",str);
		
		int j=-1;
		next[0]=-1;
		for(int i=1;i<n;i++){
			if(str[i]==str[j+1]){
				j++;
				next[i]=j;
			}else{
				while(j!=-1&&str[next[j]+1]!=str[i]){
					j=next[j];
				}
				if(str[i]==str[j+1]){
					j++;
					next[i]=j;
				}else{
					next[i]=-1;
				}
			}
		}
		
		printf("Test case #%d\n",cas);
		for(int i=1;i<n;i++){
			if(next[i]!=-1&&(i+1)%(i-next[i])==0){
				printf("%d %d\n",i+1,(i+1)/(i-next[i]));
			}
		}
		cout<<endl;
	}
	return 0;
}


你可能感兴趣的:(kmp算法)