1.str
知识点:hash算法 + 线性DP
f[i][j]=sum(f[i-1][j-ai[k]]) 匹配到第i个碱基在原蛋白质序列的方案总数
const int N=10000+10;int len;
unsigned ll data[100+3][10+2],s[10000+10],po[N];
int k;int mod=1e9+7;int ai[N],lenth[100+3][10+2];
int f[100+3][N];
char ss[N];//从i+1到 n的碱基序列的最小长度
int ans;
int main()
{
// freopen("exam.txt","r",stdin);
k=re();
scanf("%s",ss+1); len=strlen(ss+1);po[0]=1;
_f(i,1,len)
{
s[i]=s[i-1]*131+ss[i]-'A'+1;po[i]=po[i-1]*131
}
_f(i,1,k)
{
ai[i]=re();
_f(j,1,ai[i])
{
scanf("%s",ss+1);
lenth[i][j]=strlen(ss+1);
_f(ii,1,lenth[i][j])data[i][j]=data[i][j]*131+ss[ii]-'A'+1;
}
}//处理完
_f(i,0,len)
f[0][i]=1;//初始化
_f(i,1,k)//处理到第i个碱基
{
_f(o,1,len)//已经到了原蛋白质的o位置
{
_f(j,1,ai[i])//安置第i个序列
{
if(o-lenth[i][j]+1<=0)continue;//下标越界
if(f[i-1][o-lenth[i][j]]>0&&data[i][j]==(s[o]-s[o-lenth[i][j]]*po[lenth[i][j]]))//可行性
f[i][o]+=f[i-1][o-lenth[i][j]],f[i][o]%=mod;//时刻取模
}
}
}
_f(i,1,len)
ans=(ans+f[k][i])%mod;
chu("%d",ans);
return 0;
}