//这是一道字符串dp,需要用KMP进行优化
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
const int MOD=1e9+7;
const int M=1e5+5;
char s[M],t[M],nxt[M],dp[M];
int i,j,lens,lent,len;
void solve()
{
i=0,j=-1;
len=strlen(t);
nxt[0]=-1;
while(i<len)
{
if(j==-1 || t[i]==t[j])
{
++i;
++j;
nxt[i]=j;
}
else j=nxt[j];
}
}
//KMP的作用:给定一个文本s和一个字符串t,找到t在s中的所有出现
//kmp时间复杂度为O(m+n)
//kmp有失配处理方案,更重要的是利用前缀后缀的特性,从不会反反复复地找,代码里对于匹配只有一重循环
void kmp()
{
int i=0,j=0;
//j可以看做表示当前已经匹配完的模式串的最后一位的位置
lens=strlen(s);
lent=strlen(t);
while(i<lens)
{
if(j==-1 || s[i]==t[j])//如果匹配成功,那么对应的模式串位置++
{
i++;
j++;
dp[i]=dp[i-1];
if(j==lent)
{
dp[i]=(dp[i]+dp[i-j])%MOD;
j=nxt[j];
}
//如果有两种意思分f[i]=f[i-1]+f[i-len(t)];
}
else j=nxt[j];
//继续匹配
}
}
signed main()
{
// freopen(“”,“r”,stdin);
// freopen(“”,“w”,stdout);
int T;
cin>>T;
while(T–)
{
scanf(“%s%s”,s,t);
solve();
dp[0]=1;
kmp();
len=strlen(s);
cout<<dp[len]<<endl;
}
return 0;
}