其他oj可过,谷上MLE
#include<bits/stdc++.h>
#define N 105
#define M 6005
#define mod 10007
using namespace std;
int n,m;
char s[N];
namespace AC
{
int tr[M][26];
int fail[N];
int dp[N][M];
bool vis[M];
int tot = 1;
void insert(char x[],int id)
{
int u = 1,l = strlen(x + 1);
for(int i = 1;i <= l;i++)
{
if(!tr[u][x[i] - 'A']) tr[u][x[i] - 'A'] = ++tot;
u = tr[u][x[i] - 'A'];
}
vis[u] |= 1;
}
queue<int> q;
void build()
{
for(int i = 0;i < 26;i++) tr[0][i] = 1;
q.push(1);
fail[1] = 0;
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = 0;i < 26;i++)
{
int v = tr[u][i];
if(!v)
{
tr[u][i] = tr[fail[u]][i];
vis[u] |= vis[fail[u]];
}
else
{
vis[v] |= vis[fail[u]];
fail[v] = tr[fail[u]][i],q.push(v);
}
}
}
}
void solve()
{
int ans1 = 1;
for(int i = 1;i <= m;i++) ans1 = (ans1 * 26) % mod;
memset(dp,0,sizeof(dp));
dp[0][1] = 1;
for(int i = 0;i < m;i++)
{
for(int j = 1;j <= tot;j++)
{
for(int s = 0;s < 26;s++)
{
int k = tr[j][s];
if(vis[k]) continue;
dp[i + 1][k] = (dp[i + 1][k] + dp[i][j]) % mod;
//printf("dp[%d][%d]:%d\n",i + 1,k,dp[i + 1][k]);
}
}
}
int ans = 0;
for(int i = 1;i <= tot;i++) ans = (ans + dp[m][i]) % mod;
int y = (ans1 - ans) % mod;
printf("%d",(y % mod + mod) % mod);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++) scanf("%s",s + 1),AC::insert(s,i);
AC::build();
AC::solve();
return 0;
}