1. 程式人生 > >POJ 2752 Seek the Name, Seek the Fame

POJ 2752 Seek the Name, Seek the Fame

puts scan getc namespace pri algorithm n) seek ()

一道KMP題目

求出next數組後就可以得知一個字串的最長前綴-後綴字串

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
inline int read(){
	int x=0,f=1,ch=getchar();
	while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
	while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
	return x*f;
}
char s[400005];
int len,nxt[400005];
inline void get_nxt(){
	nxt[0]=-1;
	int i=0,k=-1;
	while(i<len){
		if(k==-1||s[i]==s[k]) nxt[++i]=++k;
		else k=nxt[k];
	}
}
inline void get_ans(int x){
	if(x==0) return ;
	get_ans(nxt[x]);
	printf("%d ",x);
}
int main(){
	while(scanf("%s",s)!=EOF){
		// puts("X");
		len=strlen(s);
		get_nxt();
		get_ans(len);
		puts("");
	}
	return 0;
}

  

POJ 2752 Seek the Name, Seek the Fame