裸题,直接计数就可以
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#define MAX 1000707
using namespace std;
void get_next ( char p[] , int next [] )
{
int i = 0 , k = -1 , len = strlen ( p );
next[0] = -1;
while ( i < len )
if ( k == -1 || p[i] == p[k] )
i++,k++,next[i]=k;
else k = next[k];
}
int ans,t;
char s[MAX],p[MAX/100];
int match ( char s[] , char p[] )
{
int next[MAX/100];
ans = 0;
get_next ( p , next );
int len1 = strlen ( s );
int len2 = strlen ( p );
int i = 0 , j = 0;
while ( i < len1 )
{
if ( j == -1 || s[i] == p[j] ) i++,j++;
else j = next[j];
if ( j == len2 ) ans++;
}
return ans;
}
int main ( )
{
scanf ( "%d" , &t );
while ( t-- )
{
scanf ( "%s" , p );
scanf ( "%s" , s );
printf ( "%d\n" , match ( s , p ) );
}
}