KMP模板题,不多说。
就是string的操作没有得到正确结果,肾略疼。。。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int next[10000010];
//string T,W;
char T[1000010], W[1000010];
void get_next(int len)
{
next[0] = -1;
int i = 0,j = -1;
while(i < len)
{
if(j == -1 || W[i] == W[j])
next[++ i] = ++ j;
else
j = next[j];
}
}
int kmp()
{
// int len1 = T.length() , len2 = W.length();
int len1 = strlen(T), len2 = strlen(W);
get_next(len2);
int i = 0 , j = 0;
int ans = 0;
while(i < len1)
{
if(j == -1 || T[i] == W[j])
i ++ , j++;
else
j = next[j];
if(j == len2)
ans ++ , j = next[j];
}
return ans;
}
int main()
{
//freopen("in.txt" , "r" , stdin);
int n;
scanf("%d" , &n);
while(n--)
{
/* getchar();
getline(cin , W);
getline(cin , T);*/
scanf("%s", W);
scanf("%s", T);
int ans = kmp();
printf("%d\n" , ans);
}
return 0;
}