http://acm.hdu.edu.cn/showproblem.php?pid=1686
对于我这种刚开始学的人来说 刚开始我觉的很难 不会做哦 但是看了一下别人的一下子就知道了 还是不是太熟了 需要加强练习哦 呵呵
其实这是一道简单的kmp 的算法 只要你在index_kmp() 将 i 的值一直小于N 就可以了 还是看看我具体代码吧 或许要看就知道了
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char w[10005],t[1000005];
int next[10005];
int N,M;
void get_next()
{
int i=0,j=next[0]=-1;
while(i<M)
{
if(j==-1||w[i]==w[j])
{
i++,j++;
next[i]=j;
}
else j=next[j];
}
}
int kmp()
{
int i=0,j=0;
int num=0;
while(i<N)
{
if(j==-1||t[i]==w[j])
{
i++,j++;
}
else j=next[j];
if(j==M)
{
num++;
j=next[j];
}
}
cout<<num<<endl;
}
int main()
{
int c,h,i;
while(cin>>c)
{
while(c--)
{
scanf("%s",w);
scanf("%s",t);
N=strlen(t);
M=strlen(w);
get_next();
kmp();
}
}
}