NOIP autistic Race 3

#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;
}

 

Guess you like

Origin www.cnblogs.com/stepsys/p/11620263.html