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;

}

 

你可能感兴趣的:(name)