KMP算法 Problem A. cal 2016/11/12 字符串 c++
Input file: cal.in
Output file: cal.out
Time limit: 1s
Memory limit: 128MB
题目描述
Input
Constraints
Sample.in
2
aaaa
ababab
sample.out
4 3 2 1
6 4 2
用KMP算法,算出字符串S的next值,先输出lens,再输出next[lens],并使lens=[lens],直到next[lens]=0,并且不输出0。
代码如下
(:
#include < cstdio >
#include < iostream >
#include < cstring >
#include < cstdlib >
#include < string >
using namespace std;
int t,n,nxt[1000009]={0},len;
char st[1000009];
int main()
{
freopen(“cal.in”,”r”,stdin);
freopen(“cal.out”,”w”,stdout);
scanf(“%d”,&t);
for(int k=1;k<=t;k++)
{
memset(nxt,0,sizeof(nxt));
scanf("%s",st+1);
len=strlen(st+1);
nxt[1]=0;
for(int i=2;i<=len;i++)
{
int j=nxt[i-1];
while(j>0 && st[i]!=st[j+1]) j=nxt[j];
if(st[i]==st[j+1]) j++;
nxt[i]=j;
}
cout<<len;
while(nxt[len])
{
cout<<" "<<nxt[len];
len=nxt[len];
}
cout<<endl;
}
return 0;
}