题目链接
题目大意
找出一个字符串s2中包含多少个字符串s1
思路
kmp~
代码
#include <iostream>
#include <queue>
#include <fstream>
#include <string.h>
#include <string>
#include <stack>
using namespace std;
string s1,s2;
int len1,len2;
int nxt[10010];//第一次开小了,RE。。
void getNext()
{
nxt[0] = -1;
int i = 0;
int j = -1;
while(i < len1)
{
if(j==-1 || s2[i]==s2[j])
{
i++; //6
j++; //4
nxt[i] = j;
}
else
j = nxt[j]; //不相等的话,从相等的位置开始往后继续
}
}
int kmp()
{
getNext();
int i=0,j=0;
int sum=0;
while(i < len2)
{
if(j == -1 || s1[j] == s2[i
])
{
i++;
j++;
}
else j = nxt[j];
if(j == len1)
{
sum++;
j = nxt[j];
}
}
return sum;
}
int main()
{
// ifstream fin("data.txt");
int N;
// fin>>N;
cin>>N;
while(N--)
{
cin>>s1>>s2;
len1 = s1.length();
len2 = s2.length();
int ans = kmp();
cout<<ans<<endl;
}
return 0;
}