思路:next数组应用,利用j=nxet[i],i之前与开头相同的字符串长度,每求一次next[j],可得一次答案,
反复求即可,逆序输出。
#include<iostream> //1A,172MS #include<string> #include<cstdio> using namespace std; int next[400002]; int ans[400002]; void get_next(string s) { int i=0,j=-1; int len=s.size(); next[0]=-1; while(i<len) { if(j==-1||s[i]==s[j]) { i++;j++; next[i]=j; } else { j=next[j]; } } } int main() { string s; while(cin>>s) { int num=1; int j=s.size(); get_next(s); ans[0]=j; while(next[j]>0) //反复求next[j] { ans[num++]=next[j]; j=next[j]; } for(int i=num-1;i>=0;i--) if(i!=0) printf("%d ",ans[i]); else printf("%d ",ans[i]); } return 0; }