フェイス質問
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 ])。 }