#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int Next[10000];
typedef struct{
char string[110000];
int len;
}sstring;
void GetNext(int next[],sstring s)
{
int i = 0,j = -1;
next[0] = -1;
int len = s.len;
while(i<len)
{
if(j == -1||s.string[i] == s.string[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
int KMP(sstring s,sstring t,int next[])
{
GetNext(Next,t);
int i = 0;
int j = 0;
int s_len = s.len;
int t_len = t.len;
while(i<s_len&&j<t_len)
{
if(j == -1||s.string[i] == t.string[j])
{
i++;
j++;
}
else
{
j = Next[j];
}
}
if(j == t_len)
{
return i - j;
}
return -1;
}
int main(void)
{
sstring s,t;
char ch1,ch2;
int i =0;
ch1 = getchar();
while(ch1 != '&')
{
s.string[i] = ch1;
i++;
ch1 = getchar();
}
s.len = i + 1;
i = 0;
ch2 = getchar();
while(ch2 != '&')
{
t.string[i] = ch2;
i++;
ch2 = getchar();
}
puts(s.string);//注意换行符会被读取到模式串t中去,注意直接在一行内输入主串和模式串
puts(t.string);
int cnt = KMP(s,t,Next);
printf("cnt = %d\n",cnt);
return 0;
}
有一说一,理解代码只是方便记忆。
注意跳跃dp数组的理解!