1 #include<cstdio>
2
3 #include<cstdlib>
4
5 #include<cmath>
6
7 #include<cstring>
8
9 #include<algorithm>
10
11 #include<iostream>
12
13 #include<vector>
14
15 #include<map>
16
17 #include<set>
18
19 #include<queue>
20
21 #include<string>
22
23 #define inf 1000000000
24
25 #define maxn 1000000+5
26
27 #define maxm 20000000+5
28
29 #define eps 1e-10
30
31 #define ll long long
32
33 #define pa pair<int,int>
34
35 #define for0(i,n) for(int i=0;i<=(n);i++)
36
37 #define for1(i,n) for(int i=1;i<=(n);i++)
38
39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
40
41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
42
43 #define mod 10007
44
45 using namespace std;
46
47 inline int read()
48
49 {
50
51 int x=0,f=1;char ch=getchar();
52
53 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
54
55 while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();}
56
57 return x*f;
58
59 }
60 int t[6010][26],f[110][6010][2],v[6010],go[6010];
61 char s[110];
62 queue<int> q;
63 int n,m,tot;
64 inline void insert()
65 {
66 scanf("%s",s+1);int len=strlen(s+1),now=1;
67 for1(i,len)
68 {
69 int x=s[i]-‘A‘;
70 if(!t[now][x])t[now][x]=++tot;
71 now=t[now][x];
72 }
73 v[now]=1;//标记该节点为危险节点
74 }
75 void bfs()//按bfs序来递推每节点的fail,此处用go数组表示
76 {
77 q.push(1);
78 while(!q.empty())
79 {
80 int x=q.front(),y,j;q.pop();
81 for0(i,25)
82 {
83 j=go[x];
84 while(j&&!t[j][i])j=go[j];
85 if(t[x][i])
86 {
87 go[y=t[x][i]]=j?t[j][i]:1;//该节点存在则设置它的fail
88 v[y]=v[y]|v[go[y]];//它的危险符号
89 q.push(y);//更新它的子树的fail
90 }else t[x][i]=j?t[j][i]:1;//没有出边直接补齐
91 }
92 }
93 }
94 void dp()
95 {
96 f[0][1][0]=1;
97 for0(i,m)
98 for1(j,tot)
99 for0(k,25)
100 for0(l,1)//l表示匹配还是未匹配
101 if(v[t[j][k]])(f[i+1][t[j][k]][1]+=f[i][j][l])%=mod;
102 else (f[i+1][t[j][k]][l]+=f[i][j][l])%=mod;
103 }
104
105 int main()
106
107 {
108
109 freopen("input.txt","r",stdin);
110
111 freopen("output.txt","w",stdout);
112
113 n=read();m=read();tot=1;
114 for1(i,n)insert();
115 bfs();
116 dp();
117 int ans=0;
118 for1(i,tot)(ans+=f[m][i][1])%=mod;
119 printf("%d\n",ans);
120
121 return 0;
122
123 }