Description
给定两个字符串string1和string2,判断string2是否为string1的子串。Input
输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。Output
对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。Sample Input
abc
a
123456
45
abc
ddd
Sample Output
1 4 -1
#include <iostream>
#include"cstdio"
#include"cstring"
#include"cstdlib"
using namespace std;
char st1[1000100],st2[1000100];
int next[1000100];
int n,m;
void Kmp(char s[],char t[])
{
int j=0,i;
for(i=0;i<n&&j<m;)
{
if(j==0&&st1[i]!=st2[0]){i++;continue;}
if(st2[j]==st1[i])
{
i++;j++;
continue;
}
else
{
j=next[j];continue;
}
}
if(i<=n&&j==m)printf("%d\n",i-m+1);
else printf("-1\n");
}
int main()
{memset(st1,'\0',sizeof(st1));
memset(st2,'\0',sizeof(st2));
memset(next,'\0',sizeof(next));
next[0]=-1;next[1]=0;
while(~scanf("%s%*c%s",st1,st2))
{n=strlen(st1);
m=strlen(st2);
for(int i=1;i<m-1;i++)
{
int j=next[i];
if(st2[i]==st2[j])
next[i+1]=next[i]+1;
else
for(int k=next[j];j>=-1;)
{ if(j==-1){next[i+1]=0;break;}
if(st2[k]==st2[i])
{next[i+1]=next[j]+1;break;}
else
{j=next[k];k=next[k];}
}
}
Kmp(st1,st2);
}
return 0;
}