#include<stdio.h>
#include<string.h>
void get_nextval(char pattern[],int next[])
{
int j=0,k=-1;
next[0]=-1;
while(pattern[j]!='\0')
{
if(k==-1||pattern[j]==pattern[k])
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
}
int kmp(char text[],char pattern[])
{
if(text[0]=='\0'||pattern[0]=='\0')return -1;
int len=strlen(pattern);
int next[len+1];
get_nextval(pattern,next);
int index=0,i=0,j=0;
while(text[i]!='\0'&&pattern[j]!='\0')
{
if(text[i]==pattern[j])
{
i++;
j++;
}
else
{
index+=j-next[j];
if(next[j]!=-1)
j=next[j];
else
{
j=0;
i++;
}
}
}
if(pattern[j]=='\0')
return index+1;
else return -1;
}
int main()
{
char a[1000010];
char b[1000010];
int j;
while(scanf("%s",a)!=EOF)
{
scanf("%s",b);
printf("%d\n",kmp(a,b));
}
}
SDUT2772数据结构实验之串一:KMP简单应用
最新推荐文章于 2018-08-22 21:05:58 发布