之前对KMP的next数组求法还有点不理解,看了这篇博客后理解了:http://blog.csdn.net/v_july_v/article/details/7041827
还有之前把next数组写在全局,到oj上会编译错误,???
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn1 = 10000+7;
const int maxn2 = 1000000+7;
void getNext(char *str,int next[])
{
next[0] = -1;
int k = -1;
int j = 0;
int len = strlen(str);
while(j<len)
{
if(k==-1||str[j]==str[k])
{
++k;
++j;
next[j] = k;
}
else
k = next[k];
}
}
int KMP(char *word,char *temp,int next[])
{
int cnt = 0;
int len = strlen(word);
int l = strlen(temp);
for(int i = 0,j = 0;i<len;i++)
{
while(j&&word[i]!=temp[j])
j = next[j];
if(word[i]==temp[j])
j++;
if(j==l)
cnt++;
}
return cnt;
}
int main()
{
int t;
int next[maxn1];
char str1[maxn1],str2[maxn2];
scanf("%d",&t);
getchar();
while(t--)
{
scanf("%s",str1);
scanf("%s",str2);
getNext(str1,next);
int ans = 0;
ans = KMP(str2,str1,next);
printf("%d\n",ans);
}
return 0;
}