【BJOI2019]秘術セプター

フェイス質問

https://www.luogu.org/problem/P5319

北京は妹を回復するために失敗し、唯一の北京の地方選挙を書くことができます。

問題の解決策

#include <cstdioを> 
する#include <iostreamの> 
する#include <CStringの> 
する#include <キュー> 
の#include <cmath> 
の#include <ベクトル>
 の#define N 2000
 の#define M 2000
 の#define EPS 1E-7
 の#define INF 1000000007.0
 の#define int型里登録
 使って 名前空間はstdを、

構造体ノード{
   int型プリ、トランス。
} G [N] [M]。

チャーS [N]。
チャーT [N]。
INTのN、M。

構造体AC {
   INT NEX [N]、CH [N] [ 10 ]。
  INT CNT [N]。
  ダブルV [N]、NV [N]。
  ダブルF [N] [M]。
  ベクトル < 整数 > 息子[N];
  int型のTOT;
  ボイドインサート(ダブルX){
     int型今= 0 (RI I = 1、L =用のSTRLEN(S + 1 ; iが= Lを<Iは++){)
       INT C = S [I] - ' 0 ' もし CH [今] [C] = ++(CH [今] [C]!)TOT。 = CHを[今] [C]。
    } 
    [今] CNT ++ 
    V [今]= X。
  } 
  ボイドgetfail(){ 
    キュー < INT > Q。
    (RI i = 0 ; iは= < 9 ; iは++)場合(CH [ 0 ] [i])とq.push(CH [ 0 ] [I])。
    一方、(!q.empty()){
       int型のx = q.front()。q.pop();
      以下のために(RI i = 0 ; iは= < 9 ; iは++ ){
         int型、Y =のCH [X] [I];
        もし(!Y)CH [X] [I] = CH [NEX [X] [i]は、 NEX [Y] =のCH [NEXの[X] [i]は、q.push(Y)。
      } 
    } 
  } 
  ボイド DFS(INT X){ 
    NV [X] + = NV [NEX [X]]。
    (RI i = 0 ; I <息子[X] .size(); iは++ ){ 
      DFS(息子[X] [I])。
    } 
  } 
  ボイドのinit(){
     (RI i = 1 ; I <= TOT; iは++ )息子[NEX [I]一back(I)。
  } 
  ブールチェック(ダブルMID){
     ダブル DV =ログ(MID)/ログ(1.0001 )。
    (RI i = 0 ; I <= TOT; iは++)NV [I] = V [i]は-dv *  CNT [i]は、
    DFS(0 )。
    (RI i = 0 ; I <= N; I ++ のための(RI J = 0 ; J <= TOT; J ++)[I] [J] = F - INF。
    F [ 0 ] [ 0 ] = 0 (RI i = 0 ; I <= N- 1、I ++)であれば(T [I + 1 ] == ' ' ){
       (ロードアイランドJ = 0 ; J <= TOT; J ++ のための(RI C = 0 ; C <= 9、C ++)であれば(F [I] [J] + NV [CH [J] [C]> F [I + 1] [CH [J] [C]]){ 
          G [I+ 1 ] [CH [J] [C] = (ノード){J、C}。
          F [I + 1 ] [CH [J] [C] = F [I] [J] + NV [CH [J] [] C]。
        } 
    } 
    {
       (ロードアイランドJ = 0 ; J <= TOT; J ++ のための(RI C = T [I + 1 ] - ' 0 ' ; C <= T [I + 1 ] - ' 0 '、C ++)であれば( F [I] [J] + NV [CH [J] [C]> F [I + 1 ] [CH [J] [C]]){ 
          G [I + 1 ] [CH [J] [C] = (ノード){J、C}。
          F [I 1+ ] [CH [J] = F [I] [J] + [C] NV [CH [J] [C]。
        } 
    } 
    のための(RI i = 0 ; I <= TOT; iは++)場合(F [N] [i]が> 0リターン 1 リターン 0 ; 
  } 
  ボイドプリント(){
     int型、P = 0 (RI i = 0 ; I <= TOT; iは++)場合(F [N] [I]> F [N] [P])P = I。
    int型のSS [N]。
    (RI I = N; I> = 1 ; i-- ){ 
      SS [I] = G [i]が[P] .trans。
      P =G [i]が[P] .PRE。
    } 
    のための(RI i = 1 ; I <= N; iは++)COUT << SS [i]は、
  } 
}トライ。

INT メイン(){ 
  scanf関数(" %d個の%のD "、&​​N、&M)。
  scanf関数(" %sの"、T + 1 )。
  ダブルX;
  (RI i = 1 ; I <= M; iは++ ){ 
    scanf関数(" %sの%のLF "、S + 1、およびX)。
    trie.insert(ログ(X) /ログ(1.0001 ))。
  } 
  trie.getfail()。
  trie.init();
  ダブルポンド= 1.0、RB = 1E9;
  (RI i = 1 ; iは= < 45 ; iは++ ){
     ダブルミッド=(LB + RB)/ 2.0 もし(trie.check(MID))ポンド=ミッド; 他の RB = ミッド; 
  } 
  // COUT << LB << ENDL。
  trie.print();
  リターン 0 ; 
}

 

おすすめ

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