KMP算法:
1.理解NEXT数组的意义。
2.理解模式匹配的过程。
3.理解回退的原理(从上一次匹配成功的字符串开始继续匹配)
#include <stdio.h>
#include <string.h>
int next[100000];
char ch1[10000], ch2[1000];
void getnext()
{
int len2 = strlen(ch2 + 1);
next[1] = 0;
int s = 1, t = 0;
while(s <= len2)
{
if(t == 0 || ch2[s] == ch2[t])
{
++t;
next[++s] = t;
}
else
{
t = next[t];//回退
}
}
}
bool kmp()
{
int s = 1, t = 1;
int len1 = strlen(ch1 + 1);
int len2 = strlen(ch2 + 1);
int cnt = 0;
while(s <= len1)
{
printf("[%d : %d]\n", s, t);
if(t == 0 || ch1[s] == ch2[t])
{
s++;
t++;
if(t == len2+1)
{
return true;
}
}
else
{
t = next[t];
}
}
return false;
}
int main()
{
int n;
while(~scanf("%s", ch1 + 1))
{
int len1 = strlen(ch1 + 1);
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%s", ch2 + 1);
int l = strlen(ch2 + 1);
getnext();
for(int j=1;j<=l;j++)
{
printf("%d ",next[j]);
}
if(kmp())
puts("Yes");
else
puts("no");
}
}
return 0;
}