题目地址: http://poj.org/problem?id=2752
KMP。 考验对NEXT的理解。
问字符串中,含有多少种长度不同的子串,并且这个子串既是这个字符串的前缀,同时也是这个字符串的后缀。依次输出这些长度。
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int MAXN = 1000100;
int nxt[MAXN];
int get_next(char *ptr){
int i,j;
nxt[0]=0;
for(i=1;ptr[i];i++){
j=nxt[i-1];
while(ptr[i]!=ptr[j] && j)
j=nxt[j-1];
nxt[i]=ptr[i]==ptr[j]?j+1:0;
}
return i;
}
char s[MAXN];
int res[MAXN];
int main(){
int i,len,cnt,tt=1;
while(gets(s)){
len = get_next(s)-1;
cnt=0;
do{
res[cnt++]=len+1;
len=nxt[len]-1;
}while(len>=0);
while(--cnt)
printf("%d ",res[cnt]);
printf("%d\n",res[cnt]);
}
return 0;
}