1458:Seek the Name, Seek the Fame

【题目描述】

原题来自:POJ 2752

给定若干字符串(这些字符串总长 ≤4×105​​ ),在每个字符串中求出所有既是前缀又是后缀的子串长度。

例如:ababcababababcabab,既是前缀又是后缀的:ab,abab,ababcabab,ababcababababcabab。

【输入】

输入若干行,每行一个字符串。

【输出】

对于每个字符串,输出一行,包含若干个递增的整数,表示所有既是前缀又是后缀的子串长度。

【输入样例】

ababcababababcabab
aaaaa

【输出样例】

2 4 9 18
1 2 3 4 5
#include
#include
#include
using namespace std;
const int maxn = 1e6+10;
int len,next[maxn],ans[maxn],cnt=0;
void getnext(string& str){
	len=str.length();
	int k=-1,j=0;
	next[0]=-1;
	while(j<len){
		if(k==-1||str[j]==str[k]) next[++j]=++k;
		else k=next[k];
	}
}
int main(){
	string line;
	while(cin>>line){
		memset(next,0,sizeof(next));memset(ans,0,sizeof(ans));cnt=0;
		getnext(line);
		for( int i=len; next[i]!=-1; ){
			ans[cnt++]=i;
			i=next[i];
		}
		for( int i=cnt-1; i>=0; i-- ){
			if(i!=cnt-1) printf(" ");
			printf("%d",ans[i]);
		}
		printf("\n");
	}
}

你可能感兴趣的:(#,ACM训练,#,KMP算法)