推荐博客:这里
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
const long long M=100000;
struct matrix
{
long long a[111][111];
};
int ch[111][4],val[51111];
int f[51111];
int sz,n,m;
char str[22];
map<char,int>p;
void init()
{
sz=0;
memset(ch[0],0,sizeof(ch[0]));
}
void insert(char *a,int vv)
{
int u=0,l=strlen(a);
for(int i=0; i<l; i++)
{
int c=p[a[i]];
if(!ch[u][c])
{
ch[u][c]=++sz;
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
}
u=ch[u][c];
}
val[u]=vv;
}
void getfail()
{
queue<int>q;
f[0]=0;
for(int i=0; i<4; i++)
{
int u=ch[0][i];
if(u)
{
f[u]=0;
q.push(u);
}
}
while(!q.empty())
{
int r=q.front();
q.pop();
for(int i=0; i<4; i++)
{
int u=ch[r][i];
if(!u)continue;
q.push(u);
int v=f[r];
while(v&&!ch[v][i])v=f[v];
f[u]=ch[v][i];
if(val[f[u]])val[u]=val[f[u]];
}
}
}
matrix buildmatrix()
{
matrix mat;
memset(mat.a,0,sizeof(mat.a));
queue<int>q;
q.push(0);
while(!q.empty())
{
int r=q.front();
q.pop();
for(int i=0; i<4; i++)
{
int u=ch[r][i];
if(u)
{
if(!val[u])
{
mat.a[r][u]++;
q.push(u);
}
}
else
{
int v=f[r];
while(v&&!ch[v][i])v=f[v];
int vv=ch[v][i];
if(!val[vv])mat.a[r][vv]++;
}
}
}
return mat;
}
matrix mul(matrix x,matrix y)
{
matrix c;
for(int i=0;i<=sz;i++)
{
for(int j=0;j<=sz;j++)c.a[i][j]=0;
}
for(int i=0;i<=sz;i++)
{
for(int j=0;j<=sz;j++)
{
for(int k=0;k<=sz;k++)
{
c.a[i][j]+=x.a[i][k]*y.a[k][j];
c.a[i][j]%=M;
}
}
}
return c;
}
matrix mi(matrix b,int x)
{
matrix p,q;
p=b;
memset(q.a,0,sizeof(q.a));
for(int i=0;i<=sz;i++)q.a[i][i]=1;
while(x!=1)
{
if(x%2)
{
x--;
q=mul(p,q);
}
else
{
x>>=1;
p=mul(p,p);
}
}
p=mul(p,q);
return p;
}
int main()
{
p['A']=0;
p['C']=1;
p['G']=2;
p['T']=3;
while(scanf("%d%d",&m,&n)!=EOF)
{
init();
for(int i=0; i<m; i++)
{
scanf("%s",str);
insert(str,1);
}
getfail();
//cout<<1<<endl;
matrix mat=buildmatrix();
/*for(int i=0;i<=sz;i++)
{
for(int j=0;j<=sz;j++)printf("%d ",mat.a[i][j]);
printf("\n");
}*/
mat=mi(mat,n);
long long ans=0;
for(int i=0;i<=sz;i++)
{
ans+=mat.a[0][i];
ans%=M;
}
printf("%lld\n",ans);
}
return 0;
}