POJ 2752 Seek the Name, Seek the Fame next数组理解加深

题意:给你一个字符串,寻找前缀和后缀相同的子串(包括原串)、 从小到大排列输出其子串的长度

思路:KMP  next 数组应用、

其实就是一个数学推导过程、

首先由next数组 可知s(ab) = s(bd)   此时next[d]=b   而此时 next[b]=f,意味着s(ef)=s(gh)

 s(gh)属于s(ab)   s(ab)=s(bd);   所以可以推出 s(gh)属于s(bd)    且s(ef)=s(gh)  所以 s(ef)属于s(cd)

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
const int qq=400000+10;
char node[qq];
int next[qq];
int get[qq];
int len;
void getnext()
{
	int i,j;
	i=0;j=-1;
	next[0]=-1;
	while(i<len){
		if(j==-1||node[i]==node[j])
			next[++i]=++j;
		else
			j=next[j];
	}
	return;
}
int main()
{
	while(~scanf("%s",node)){
		len=strlen(node);
		getnext();
		int k=len;
		int i=0;
		while(next[k]!=0){			// 那个公式的推导体现在这里、 
				get[i++]=next[k];
				k=next[k];
		}
		for(int j=i-1;j>=0;--j)
			printf("%d ",get[j]);
		printf("%d\n",len);
	}
	return 0;
} 

 

posted @ 2016-03-24 21:38  我不萌、我要高冷  阅读(248)  评论(0编辑  收藏  举报