//节奏有点快,昨天刚看了BFS,今天又KMP,有点忙,第一次试着写了写最简单的KMP算法,结果一直TLE,没找出原因,先发上来,找出来了再改。
#include <string.h>
char s[1000009],t[1000009];
int next[1000009];
void getnext(char t[])//获取next函数值
{
int i,j;
i=1;
j=0;
next[1]=0;
while (i<=strlen(t))
{
if (j==0||t[i-1]==t[j-1])
{
i++;
j++;
next[i]=j;
}
else j=next[j];//回溯
}
}
int kmp(char s[],char t[])//KMP算法
{
int i=1,j=1;
while (i<=strlen(s)&&j<=strlen(t))
{
if (j==0||s[i-1]==t[j-1])
{
i++;
j++;
}
else j=next[j];//回溯
}
if (j>strlen(t))
return i-strlen(t);
else return -1;
}
int main()
{
while(~scanf("%s%*c%s",s,t))
{
getnext(t);
printf("%d\n",kmp(s,t));
}
return 0;
}
//如果哪位大神看出了问题,请及时告诉我,在此谢过。
//TLE找到原因了,效率太低,把strlen替换了就可以了,每次调用都得计算一遍所以TLE了。l=strlen(s);r=strlen(t);