题意:找出字符串S前后缀相同的串的长度,升序输出。
分析:简单KMP,emmm很激动自己想出来了,虽然简单,不多说考虑前后缀相同的字符串对应字符是相同的。
//但是用set存答案T了,直接用数组就A了。
参考代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<set>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 1e6+10;
int n;
char S[maxn];
int nxt[maxn];
int ans[maxn];
void GetNext()
{
int i = 0, j = -1;
nxt[0] = -1;
while( i < n)
{
if( j == -1 || S[i] == S[j])
nxt[++i] = ++j;
else
j = nxt[j];
}
}
int main()
{
while( ~scanf("%s",S))
{
n = strlen(S);
GetNext();
// for( int i = 0; i <= n; i++)
// printf("%d ",nxt[i]);
// puts("");
int p = nxt[n];
int len = 0;
while( p)
{
ans[len++] = p;
p = nxt[p];
}
for( int i = len-1; i >= 0; i--)
printf("%d ",ans[i]);
printf("%d\n",n);
// for( set<int> :: iterator it = ans.begin(); it != ans.end(); it++)
// printf("%d ",*it);
// printf("%d\n",n);
}
return 0;
}