题目大意:
输入一个字符串然后输出所有前缀等于后缀的
情况,并以其长度输出来。(字符串自身也是一种情况)
kmp算法next数组的应用,先求出字符串的next数组,然后j=next[j]进行回溯(j为字符串的长度)。
using namespace std;
char str[400010];
int next[400010];
int result[400010];
//保存结果
int main ()
{
int i,j;
int sLen;
int len;
int k;
int temp;
while(cin>>str)
{
sLen=strlen(str);
next[0]=-1;
//求出next数组
j=-1;
for(i=1;i
{
while(j>=0&& str[j+1]!=str[i])
j=next[j];
if(str[j+1]==str[i])
j=j+1;
next[i]=j;
}
k=0;
//回溯初始化
len=next[sLen-1];
result[k]=sLen;
while(len>=0)
//回溯next数组
{
k++;
result[k]=len+1;
//字符串是从下标为0开始保存的,所以前面的个数要+1
len=next[len];
}
for(j=k;j>=0;j--)
//倒序输出
cout<<result[j]<<"";
cout<<endl;
}
return 0;
}
题目分析:
如
ababcababababcabab,
next[18]=9,整个字符串前缀和后缀相同的值为9,输出;然后前9个字符中寻找前缀等于后缀的情况,输出(next[9]=4,abab是前9个字符的后缀,同时也是整个字符串的后缀,因为前九个字符是整个字符串的后缀),以此类推。输出所有的结果。
题目代码:
#include
#include