题目描述
输入
输出
示例输入
abc a 123456 45 abc ddd
示例输出
1 4 -1
提示
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int next[1000000];
void getnext(char s[])
{
int j=0,k=-1,len=strlen(s);
next[0]=-1;
while(j<len)//将字符串中每一个元素找到它失配后的位置
{
if(k==-1||s[j]==s[k])
{
j++;
k++;
next[j]=k;
}
else
{
k=next[k];
}
}
}
int kmp(char s1[],char s2[])
{
int i=0,j=0,len1=strlen(s1),len2=strlen(s2);
while(i<len1&&j<len2)
{
if(j==-1||s1[i]==s2[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(s2[j]=='\0')
{
return i-len2+1;
}
return -1;
}
int main()
{
char s1[1000000],s2[1000000];
int x;
while(gets(s1)!=NULL)
{
gets(s2);
getnext(s1);
x=kmp(s1,s2);
printf("%d\n",x);
}
return 0;
}
第二:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int next[1000000];
void getnext(char s[])
{
int len=strlen(s);
int i=0,j=-1;
next[0]=-1;//第一个点
while(i<len)//找到字符串中每一个元素失配后的位置
{
if(j==-1||s[i]==s[j])
{
i++;
j++;//j就是kmp中如果i匹配失败可以回到的点
next[i]=j;//j此时加1,s[i]前面每有一个点与最前面的点相同j就加一代表kmp中i可返回这个位置就是自己与自己匹配
}
else
{
j=next[j];//next【0】为第一个点还不匹配j变成-1,j从头开始匹配
}
}
}
int kmp(char s1[],char s2[])
{
int len1=strlen(s1),len2=strlen(s2),i=0,j=0;
while(i<len1&&j<len2)
{
if(j==-1||s1[i]==s2[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(s2[j]=='\0')
return i-len2+1;
return -1;
}
int main()
{
char s1[1000000],s2[1000000];
int x;
while(gets(s1)!=NULL)//s1一定没问题,找s2匹配不成功时该去的位置
{
gets(s2);
getnext(s2);
x=kmp(s1,s2);
printf("%d\n",x);
}
return 0;
}