【poj2752】Seek the Name, Seek the Fame kmp

xiaoxiao2021-02-28  33

题意:给你一个字符串,输出所有不同的前缀后缀字符串(即是前缀又是后缀)的长度。

题解:运用kmp中的next数组的思想递推一下即可。

//poj2752 Seek the Name, Seek the Fame #include<iostream> #include<algorithm> #include<string> #include<cstring> #include<cstdio> using namespace std; string s; int nxt[400010],ans[400010]; int n,m, cnt; int main() { while(cin>>s) { cnt=0; memset(ans,0,sizeof(ans)); memset(nxt,0,sizeof(nxt)); cnt=0; n=s.length(); nxt[0]=0;nxt[1]=0; for (int i=1;i<n;i++) { int j=nxt[i]; while(j&&s[j]!=s[i]) j=nxt[j]; nxt[i+1]=s[i]==s[j]?j+1:0; } int k=n; while(k) ans[cnt++]=k,k=nxt[k]; ans[cnt++]=s[0]==s[n-1]?1:0,cnt--; sort(ans,ans+cnt); printf("%d",ans[0]); for (int i=1;i<cnt;i++) printf(" %d",ans[i]); printf("\n"); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2622888.html

最新回复(0)