#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <ベクトル> の#define MP(a、b)はmake_pair(B) の#define N 2005 使って 名前空間STD。 const int型のmod = 1000000007 ; INT AUX [N * 200 ]、ツリー[N * 200 ] [ 26 ]。 int型 CNT = 1 ; INT DP [N * 30 ] [N]。 INTのN、M。 文字列sの。 構造体ゼロ{ INTNXTへ。 }エッジ[(N * 200)<< 1 ]。 int型のヘッド[N * 200 ]、TOT = 0 。 ボイド add_edge(int型、int型 B){エッジ[++ TOT =(ゼロ){ヘッド[A]、B};ヘッド[A] = TOT;} ボイド挿入(int型のx、int型POS){ // COUT << X << " "<< S <<"" << POS << ENDL。 もし(POS == s.size()){AUX [X] = 1。返す;} 場合(ツリー[X] [S [POS] - [ A ' ])(ツリー[X] [S [POS]を挿入します- ' '1 ); 他の挿入(ツリー[X] [S [POS] - ' ' ] = ++ CNT、POS + 1 )。 } ボイド DFS(int型X){ DP [X] [ 0 ] = 1 ; 以下のために(int型 ; I I = I =ヘッド[X] {エッジ[I] .nxt) INTへ= エッジ[I] .TO。 DFS(へ)。用(int型 R = AUX [X]; R> = 0 ; r--の){ ための(int型のk = 1 ; K <= AUX【に】あり、k ++ ) DP [X] [R + K] =(1LL * DP [X] [R + K] + 1LL * DP []に[K] * DP [X] [R]%のMOD)%MOD。 DP [X] [R] = 0 ; } AUX [X] + = AUX [に対する]; AUX [X] = 分(AUX [X]、M)。 } DP [X] [ 1 ] ++ ; // のprintf( "[%のD]%D \ n"、X、AUX [X])。 // ためCOUT << DP [X] [I] <<」「; COUT << ENDL(INT i = 1; iは++; iが= AUX [X] <)。 } int型のmain(){ // freopenは( "a.in"、 "R"、STDIN)。 scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型 i = 1 ; iが<= N。S; (インサート1、0 ); } // COUT << CNT << ENDL。 以下のために(int型 i = 1 ; iは= CNTを<; iは++ ){ 用(INTの R = 0、R < 26であり; R ++ ) 場合(ツリー[I] [R])add_edge(I、ツリー[I] [R]) ; } DFS(1 )。 COUT << DP [ 1 ] [M] << ENDL。 }