poj2752

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;
}
原文地址:https://www.cnblogs.com/FCWORLD/p/2048045.html