给一个字符串,求满足既是这个字符串的前缀,又是这个字符串的后缀,从小到大输出长度
思路:
细讲next数组含义博文:点我
KMP的next数组干的是子串最长后缀。
所以从最后一个next一直往前跳,next存的就是最长后缀,知道为0||-1;
//#include<bits/stdc++.h> #include<cstdio> #include<math.h> #include<string.h> #include<algorithm> using namespace std; typedef long long LL; const int N=4e5+10; int Next[N],len; char s[N]; //ababcababababcabab //2 4 9 18 void GetNext() { int i=0,j=-1; Next[0]=-1; while(i<len) { if(j==-1||s[i]==s[j]) Next[++i]=++j; else j=Next[j]; } } int ans[N],num; int main() { while(~scanf("%s",s)) { len=strlen(s); GetNext(); int x=len; num=0; while(Next[x]!=0&&Next[x]!=-1) { ans[num++]=Next[x]; x=Next[x]; } sort(ans,ans+num); for(int i=0;i<num;i++) printf("%d ",ans[i]); printf("%d ",len); } return 0; }