题目链接:https://vjudge.net/problem/POJ-2752
题意:给出一个字符串,问字符串中存在多少子串,使得这些子串既是字符串的前缀,又是字符串的后缀,要求从小到大依次输出这些子串的长度。
思路:利用KMP算法,求出next数组,next数组记录的是字符串匹配过程中失配情况下可以向前多跳几个字符,当然它描述的也是子串的对称程度。
Sample Input
ababcababababcabab aaaaa
Sample Output
2 4 9 18 1 2 3 4 5
代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a[400040];
int b[400040];
int nex[400040];
void getf(int L)//求出next数组
{
memset(nex,0,sizeof(nex));
nex[0]=-1;
int i=0,j=-1;
while(i<L)
{
if(j<0||a[i]==a[j])
nex[++i]=++j;
else
j=nex[j];
}
}
int main()
{
while(~scanf("%s",a))
{
int L=strlen(a);
getf(L);
int j=nex[L];
int r=0;
while(j>0)//递归的过程
{
b[r++]=j;
j=nex[j];
}
sort(b,b+r);
for(int i=0; i<r; i++)
printf("%d ",b[i]);
printf("%d\n",L);
}
return 0;
}