NOIP自閉症のレース3

#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; 
    (インサート10 ); 
} // 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。
}

 

おすすめ

転載: www.cnblogs.com/stepsys/p/11620263.html
おすすめ