#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #define mp(a,b) make_pair(a,b) #define N 2005 using namespace std; const int mod=1000000007; int aux[N*200],tree[N*200][26]; int cnt=1; int dp[N*30][N]; int n,m; string s; struct zero{ int nxt,to; }edge[(N*200)<<1]; int head[N*200],tot=0; void add_edge(int a,int b){edge[++tot]=(zero){head[a],b};head[a]=tot;} void insert(int x,int pos){ // cout<<x<<" "<<s<<" "<<pos<<endl; if(pos==s.size()){aux[x]=1;return;} if(tree[x][s[pos]-'a'])insert(tree[x][s[pos]-'a'], pos +1); else insert(tree[x][s[pos]-'a']=++cnt,pos+1); } void dfs(int x){ dp[x][0]=1; for(int i=head[x];i;i=edge[i].nxt){ int to=edge[i].to; dfs(to); for(int r=aux[x];r>=0;r--){ for(int k=1;k<=aux[to];k++) dp[x][r+k]=(1ll*dp[x][r+k]+1ll*dp[to][k]*dp[x][r]%mod)%mod; dp[x][r]=0; } aux[x]+=aux[to];aux[x]=min(aux[x],m); } dp[x][1]++; // printf("[%d] %d\n",x,aux[x]); // for(int i=1;i<=aux[x];i++)cout<<dp[x][i]<<" ";cout<<endl; } int main(){ // freopen("a.in","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ cin>>s; insert(1,0); }//cout<<cnt<<endl; for(int i=1;i<=cnt;i++){ for(int r=0;r<26;r++) if(tree[i][r])add_edge(i,tree[i][r]); } dfs(1); cout<<dp[1][m]<<endl; }