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();
}
}
}