class Solution {
public:
int kmpSearch(char *s,char *p,int next[])
{
int i=0;
int j=0;
int sLen=strlen(s);
int pLen=strlen(p);
while(i<sLen&&j<pLen)
{
if(j==-1||s[i]==p[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j==pLen)
return i-j;
else
return -1;
}
void getNext(char *p,int next[])
{
int pLen=strlen(p);
next[0]=-1;
int k=-1;
int j=0;
while(j<pLen)
{
if(k==-1||p[j]==p[k])
{
k++; // p0p1...pk-1 pk pj-k...pj-1 pj 已知next[j]=k;求 next[j+1]=? 看pk是否和pj相等,若相等。next[j+1]=k+1;
j++;
next[j]=k;//否则 就往前走了,可能是是更小的一段。
}
else
k=next[k];
}
}
int strStr(char *a, char *b) {
int lenA=strlen(a);
int lenB=strlen(b);
if(lenB>lenA) return -1;
int *next=new int[strlen(a)];
getNext(b,next);
return kmpSearch(a,b,next);
}
};
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
char mo[10005];
char str[1000005];
int N;
int main() {
scanf("%d", &N);
while(N--) {
scanf("%s %s", mo, str);
int next[10005] = {-1};
int i = 0, j = -1, len = strlen(mo);
while(i < len) { //获得next函数
if(j == -1 || mo[i] == mo[j]) next[++i] = ++j;
else j = next[j];
}
int ans = 0, len1 = strlen(str);
i = j = 0;
while(i < len1) { //求模式串在原串中出现的次数
if(j == -1 || str[i] == mo[j]) ++i, ++j;
else j = next[j];
if(j == len) ans++;
}
printf("%d\n", ans);
}
return 0;
}