[] JSOI2009楽しいゲーム

フェイス質問

http://darkbzoj.tk/problem/1444

問題の解決策

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <キュー>
 の#define里intを登録し
 使用して 名前空間はstdを、
構造体ノード{
   int型の息子[ 26 ]、最後の失敗します。
} T [ 500 ]。
INTの TOT、N、M、L、POS [ 20 ]。
チャー CH [ 50 ]。
ダブル G [ 200 ] [ 200 ]、P [ 50 ]。

ボイドインサート(CHAR * sで、int型のID){
   int型、U = 0 にとって(RI i = 1 ; iは= Lを<; iは++ ){
     場合(!tの[U] .son [S [i]が- 65 ])T [U] .son [S [i]が- 65 ] = ++ TOT ; 
    U = T [U] .son [S [i]が- 65 ]。
  } 
  T [U] .last = ID。POS [ID] = U。
} 

ボイドビルド(){ 
  キュー < INT > Q。
  (RI i = 0 ; I <M; iは++)場合(T [ 0 ] .son [i])とq.push(T [ 0 ] .son [I])。
  しばらく(!q.empty()){
     int型のu = q.front(); q.pop();
    にとって(RI i = 0 ; iが<M; iが++ ){
       もし(T [U] .son [I])T [T [U] .son [i]は] =の失敗。Tは[T [U] .fail]。息子[i]は、q.push(T [U] .son [I])。
      他の [U] .son [I] = T [I] T [T [U] .fail] .son。
      T [U] .last | = T [T [U] .fail] .last。
    } 
  } 
} 

ボイドガウス(){
   (RI i = 0 ; I <= TOT; iが++ ){
     int型、P = 0 (J ++; J <= TOT RIのJ = 1)であれば(G [j] [i])と{P = J。ブレーク;}
     ため(ロードアイランドJ = 0 ; J <= TOT + 1、J ++)スワップ(G [I] [J]、G [P] [J])。
    ダブル T = G [i]は[I]。
    (RIをJ = 0 ; J <= TOT + 1、J ++)G [I] [J] / = T。
    (RIをJ = + 1、J <= TOTあり、j ++ ){
       ダブル D = G [j]と[I]。
      (RI k = 0 ; K <= TOT + 1 ; ++ K)G [J] [K] - = G [i]が[K] * D。
    } 
  } 
  のための(RI I = TOT; I> = 0 ; i-- ){ 
    G [i]が[TOT + 1 ] / = G [i]は[I]。
     RI J = I-(1 ; J> = 0; j--)G [J] [TOT + 1 ] - = G [j]と[I] * G [I] [TOT + 1 ]。
    もし(!のG [i]が[TOT + 1 ])G [I] [TOT + 1 ] = 0 ; 
  } 
} 

int型のmain(){ 
  scanf関数(" %D%D%D "、&​​N、&L、およびM)。
  (RI i = 0 ; iが<M iが++ ){
     int型、B。
    scanf関数(" %D%dの"、&​​、&B)。
    P [I] = 1.0 * A / B。
  } 
  のための(RI i = 1 ; iが<= N; iが++ ){ 
    (scanf関数を" %sの"、CH + 1 )。
    (CH、I)を挿入。
  } 
  ビルド()。
  (RI i = 0 ; I <= TOT; I ++ のための(RI J = 0 ; J <M、J ++)場合(!T [i]は.last)G [T [i]は.son [J] [ I] + = P [J]。
  (RI i = 0 ; I <= TOT; iは++)G [i]は[I] - (RI i = 0 ; I <= TOT; iは++)場合(T [i]が.last)G [ 0 ] [I] = 1 G [ 0 ] [I] = 0 ; 
  G [ 0 ] [TOT + 1] = 1 
  ガウス(); 
  (RI i = 1 ; I <= N; iは++)のprintf(" %.2lfする\ n "、G [POSを[I] [TOT + 1 ])。
}

 

おすすめ

転載: www.cnblogs.com/shxnb666/p/11279464.html