POJ2752 Seek the Name,Seek the Fame KMP算法

KMP继续练手.题目问的是一个串前缀等于后缀的可能长度是哪些,输出来.题目考的是对KMP失配指针的理解,当最后一位失配(即'\0'那里)时,指针会移动到前缀对应匹配的部分,所以这个长度是我们要的,然后接着这个新的前缀的失配指针移到的部分,与这个前缀的后缀也是匹配的..这样一直滚下去就可以了得到所有可能的值.

贴一记代码.

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define mxp 400050

int f[mxp+50];
char P[mxp+50];

void getFail(const char *P,int *f)
{
	int m=strlen(P);
	f[0]=f[1]=0;
	for(int i=1;i<m;++i){
		int j=f[i];
		while(j&&P[i]!=P[j]) j=f[j];
		f[i+1]= P[i]==P[j]? j+1:0;
	}
}

int main()
{
	while(scanf("%s",P)!=EOF)
	{
		getFail(P,f);
		int n=strlen(P);
		vector<int> ans;
		while(n){
			ans.push_back(n);
			n=f[n];
		}
		reverse(ans.begin(),ans.end());
		printf("%d",ans[0]);
		for(int i=1;i<ans.size();++i){
			printf(" %d",ans[i]);
		}
		puts("");
	}
	return 0;
}

 

posted @ 2013-12-22 01:31  chanme  阅读(184)  评论(0编辑  收藏  举报