#include<bits/stdc++.h>
int next[1000000];
char str[1000000],substr[1000000];
void getnext()
{
int i = 0, j = -1;
next[0] = -1;
while(substr[i] != '\0')
{
if(j==-1 || substr[i] == substr[j])
{
++i;
++j;
next[i] = j;
}
else
j = next[j];
}
}
int kmp()
{
int i = 0, j = 0;
int len1 = strlen(str), len2 = strlen(substr);
while(i < len1 && j < len2)
{
if(j == -1 || str[i] == substr[j])
{
++i;
++j;
}
else
j = next[j];
}
if(j >= len2)
printf("%d\n",i-len2+1);
else
printf("-1\n");
}
int main()
{
while(gets(str))
{
gets(substr);
getnext();
kmp();
}
return 0;
}
kmp 的一个不怎么地的板子
最新推荐文章于 2022-10-10 20:32:38 发布