1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 typedef long long ll; 6 const char* ss="ATCG"; 7 const int N=100+10,M=4,mod=100000; 8 int m,n; 9 char s[N]; 10 struct Mat { 11 int a[N][N],n; 12 int* operator[](int x) {return a[x];} 13 Mat(int x) {memset(a,0,sizeof a),n=x;} 14 Mat operator+(Mat b) { 15 Mat c(n); 16 for(int i=0; i<n; ++i) 17 for(int j=0; j<n; ++j)c[i][j]=(a[i][j]+b[i][j])%mod; 18 return c; 19 } 20 Mat operator*(Mat b)const { 21 Mat c(n); 22 for(int k=0; k<n; ++k) 23 for(int i=0; i<n; ++i) 24 for(int j=0; j<n; ++j)c[i][j]=(c[i][j]+(ll)a[i][k]*b[k][j])%mod; 25 return c; 26 } 27 }; 28 Mat Pow(Mat x,int p) { 29 Mat ret(x.n); 30 for(int i=0; i<x.n; ++i)ret[i][i]=1; 31 for(; p; p>>=1,x=x*x)if(p&1)ret=ret*x; 32 return ret; 33 } 34 struct AC { 35 int go[N][M],pre[N],end[N],tot; 36 int idx(char ch) { 37 if(ch=='A')return 0; 38 if(ch=='T')return 1; 39 if(ch=='C')return 2; 40 if(ch=='G')return 3; 41 return -1; 42 } 43 int newnode() {int u=tot++; pre[u]=end[u]=0,memset(go[u],0,sizeof go[u]); return u;} 44 void init() {tot=0,newnode();} 45 void ins(char* s,int n) { 46 int u=0; 47 for(int i=0; i<n; u=go[u][idx(s[i])],++i) 48 if(!go[u][idx(s[i])])go[u][idx(s[i])]=newnode(); 49 end[u]=1; 50 } 51 void build() { 52 queue<int> q; 53 for(int i=0; i<M; ++i)if(go[0][i])q.push(go[0][i]); 54 while(q.size()) { 55 int u=q.front(); 56 q.pop(); 57 end[u]|=end[pre[u]]; 58 for(int i=0; i<M; ++i) { 59 if(go[u][i])pre[go[u][i]]=go[pre[u]][i],q.push(go[u][i]); 60 else go[u][i]=go[pre[u]][i]; 61 } 62 } 63 } 64 Mat getmat() { 65 Mat ret(tot); 66 for(int i=0; i<tot; ++i) 67 for(int j=0; j<M; ++j)if(!end[go[i][j]])ret[go[i][j]][i]++; 68 return ret; 69 } 70 } ac; 71 int main() { 72 ac.init(); 73 scanf("%d%d",&m,&n); 74 while(m--)scanf("%s",s),ac.ins(s,strlen(s)); 75 ac.build(); 76 Mat x=ac.getmat(); 77 x=Pow(x,n); 78 int ans=0; 79 for(int i=0; i<x.n; ++i)ans=(ans+x[i][0])%mod; 80 printf("%d ",ans); 81 return 0; 82 }