题目意思就是找子串在一个长串中出现的次数。 因为数据较大,一般的做法都超时,看了看kmp算法,用这个算法做的。这个算法最难的就是求那个next数组吧。
#include<iostream>
#include<functional>
#include<queue>
#include<vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#define Max 1000000000
using namespace std;
string x,y;
int num1,num2;
void getnext(int * next)
{
next[0]=-1;
int i=0,j=1;
while(j<num1)
{
if (x[i]==x[j]||i==-1)
{
i++;
j++;
if (x[i]!=x[j])
next[j]=i;
else next[j]=next[i];
}
else
{
i=next[i];
}
}
}
void Find(int *next)
{
int i=0,j=0;
int Count=0;
while(j<num2)
{
if (x[i]==y[j]||i==-1)
{
i++;
j++;
}
else
{
i=next[i];
}
if (i==num1)
{
i=next[i];
Count++;
}
}
cout<<Count<<endl;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int next[15000];
cin>>x>>y;
num1=x.size();
num2=y.size();
getnext(next);
Find(next);
}
return 0;
}