http://poj.org/problem?id=2752
View Code
//寻找前子串与后子串相等的子串
#include<iostream>
using namespace std;
char ch[400001];
int next[400001];
int ans[400001];
void solve (char *s, int ls)
{
int i=0,j=-1;
next[0] = -1;
while(i<ls)
{
if(j==-1 || s[i]==s[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
int main()
{
while(cin>>ch)
{
memset(ans , 0 ,sizeof(ans));
int i,j;
ans[0]=strlen(ch);
i=0;j=1;
solve(ch, ans[0]);
while(ans[i++])
{
ans[i] = next[ans[i-1]];//从长到短,递归查找前子串和后子串相等的子串
}
for(j=i-2;j>=0;j--)
{
cout<<ans[j];
if(j) cout<<" ";
}
cout<<endl;
}
return 0;
}