您的位置:首页 > 其它

KMP poj 2752 Seek the Name, Seek the Fame

2013-12-03 12:33 309 查看
深入理解KMP中的next,当我们求完next之后,len为字符串S的长度, 令j = next[len],k = next[j],则有:S[j-k+1, j] = S[len-k+1, len],就是根据这个思路来求解这个问题;

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int MAXN = 400010;

int next[MAXN];

void Get_next(char* str)
{
int i = 0, j = -1;
next[0] = -1;
int len = strlen(str);
while(i < len)
{
if(j == -1 || str[i] == str[j])
{
++i;
++j;
next[i] = j;
}
else
j = next[j];
}
}

int main()
{
char str[MAXN];
while( ~scanf("%s", str) )
{
Get_next(str);
int len = strlen(str);
int k = 0, i = len;
int sum[MAXN];
sum[0] = len;
while(next[i] > 0)
{
sum[++k] = next[i];
i = next[i];
}
for(i = k; i >= 0; i--)
cout<<sum[i]<<" ";
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: