POJ 2752 Seek the Name, Seek the Fame
题意
给定一个字符串 S,求出 S 中所有的既是前缀又是后缀的子串。
题解
求出 next 数组,答案就是 len, next[len], next[next[len]],...直到为0为止。
const int N=4e5+10;
char s[N];
int ne[N];
int n;
void init()
{
for(int i=2,j=0;i<=n;i++)
{
while(j && s[i] != s[j+1]) j=ne[j];
if(s[i] == s[j+1]) j++;
ne[i]=j;
}
}
void print(int n)
{
if(n == 0) return;
print(ne[n]);
cout<<n<<' ';
}
int main()
{
while(~scanf("%s",s+1))
{
n=strlen(s+1);
init();
print(n);
cout<<endl;
}
//system("pause");
}