孩子受不了了啊~~
40pts求调,wa#1,#6,#7,#8,#9,#10
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=10007;
inline int read(){
char c=getchar();int x=0,fh=0;
while(c<'0'||c>'9'){fh|=c=='-';c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return fh?-x:x;
}
struct node{
int son[26];
int ed;
}tr[58600];
int cnt,fail[200500],vis[250050],f[8500][150];
int n,m;
inline int ksm(int a,int b){
int res=1;
while(b){
if(b&1)res=(res*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return res;
}
inline void insert(string s){
int p=0;
for(int i=0;i<s.size();i++){
int ch=s[i]-'A';
if(!tr[p].son[ch])tr[p].son[ch]=++cnt;
p=tr[p].son[ch];
}
tr[p].ed=1;
}
queue<int>q;
inline void getfail(){
for(int i=0;i<26;i++){
if(tr[0].son[i]){
q.push(tr[0].son[i]);
}
}
while(q.size()){
int u=q.front();q.pop();
for(int i=0;i<26;i++){
int v=tr[u].son[i];
if(v){
fail[v]=tr[fail[u]].son[i];
q.push(v);
tr[v].ed|=tr[fail[v]].ed;
}
else tr[u].son[i]=tr[fail[u]].son[i];
}
}
}
inline void clear(){
memset(tr,0,sizeof tr);
memset(fail,0,sizeof fail);
memset(vis,0,sizeof vis);
cnt=0;
}
inline void solve(){
f[0][0] = 1;
for(int i=1;i<=m;i++){
for(int j=0;j<=cnt;j++){
if(!tr[j].ed){
for(int k=0;k<26;k++)f[i][tr[j].son[k]]=(f[i][tr[j].son[k]]+f[i-1][j])%mod;
}
}
}
int ans = 0;
for(int j=0;j<=cnt;j++){
if(!tr[j].ed){
ans=(ans+f[m][j])%mod;
}
}
cout<<((ksm(26,m)-ans)%mod+mod)%mod;
}
signed main(){
ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m;
string a;
for(int i=1;i<=n;i++){
cin>>a;
insert(a);
}
getfail();
solve();
return 0;
}