题意:求出串中所有前缀和后缀相同的情况的相同字串的长度.
分析:因为要找后缀与前缀相同,只需判断next中最后一个的值,因为next[len]代表的是s[0~next[len]-1]与s[len-next[len]~len-1]两个串相同,所以如果存在,则继续向前找,如果最后以为就不匹配说明只有当长度为len时才会发生前缀与后缀相同.也就是说原串全选,前缀和后缀肯定是相同的.
wa的原因:1A
AC代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define M 400005
char s[M];
int next[M],ans[M];
int len,m,j;
int i;
void get_next(){
next[0]=-1;
j=-1;i=0;
for(int i=1;i<len;++i){
while(j!=-1&&s[j+1]!=s[i])j=next[j];
if(s[j+1]==s[i])j++;
next[i]=j;
}
}
int main(){
while(cin>>s){
int sum=0;
len=strlen(s);
get_next();
j=len-1;
while(j!=-1){
ans[sum++]=j+1;
j=next[j];
}
for(int i=sum-1;i>=0;--i)
cout<<ans[i]<<" ";
cout<<endl;
}
}