[USACO12Jan]ビデオゲームのコンボ

フェイス質問

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

問題の解決策

// luogu-判定部有効-O2 
の#include <cstdioを> 
する#include <iostreamの> 
の#include <CStringの> 
の#include <キュー>
 の#define里レジスタint型
 の#define N 1050
 の#define K 1050
 使って 名前空間はstdを、
int型N、K。
チャー S [ 20 ]。

構造体acautomato {
   INT CH [N] [ 3 ]、ヴァル[N]。
  INT NEX [N]、CNT [N]。
  int型のTOT;
  INT [K] [N] F。
  ボイド挿入(){
     int型今= 0;
    (RI I = 1、L =用のSTRLEN(S + 1 ; iが= Lを<Iは++){)
       INT C = S [I] - [ A ' もし CH [今] [C] = ++(CH [今] [C]!)TOT。 = CHを[今] [C]。
    } 
    [今] CNT ++ 
  } 
  ボイドgetfail(){ 
    キュー < INT > Q。
    しばらく(!q.empty())q.pop();
    (RI C = 0 ; C < 3 ; C ++)場合(CH [ 0 ] [C]){
      もし(CNT [CH [ 0 ] [C])のval [CH [ 0 ] [] C] = 1のval [CH [ 0 ] [] C] = 0 ; 
      q.push(CH [ 0 ] [C])。
    } 
    ながら(!q.empty()){
       int型のx = q.front()。q.pop();
      (RI C = 0 ; C < 3 ; C ++ ){
         int型、Y =のCH [X] [C]。
        もし(!Y)CH [X] [C] = CH [NEX [X] [C]。 
        { 
          NEX [Y] =のCH [NEXの[X] [C]。
          もし(CNT [Y])ヴァル[Y] = valの[NEX [Y] + 1のval [Y] = valの[NEX [Y]。
          q.push(Y)。
        } 
      } 
    } 
  } 
  int型のDP(){ 
    memsetの(F、 - 0x3fをはsizeof (F))。
    F [ 0 ] [ 0 ] = 0 int型 ANS = 0 ;
    (RI i = 0 ; I <= K- 1 ; I ++ のための(RI J = 0 ; J <= TOT; J ++ のための(RI C = 0 ; C <3 ; C ++ ){ 
          F [I + 1 ] [CH [J] [C] = MAX(F [I + 1 [I] [J] + F] [CH [J]、[C]、ヴァル[CH [ J] [C])。
          もし(F [I + 1 ] [CH [J] [C]]> ANS)ANS = F [I + 1 ] [CH [J] [] C]。
        } 
    // (RI i = 0; iについて<;(ANS = TOT I ++)は、F [k]は[i])とする場合> ANS = F [k]は[I]。
    戻るANSを。
  } 
}トライ。

INT メイン(){ 
  scanf関数(" %d個の%のD "、&​​N&K)。
  (RI i = 1 ; iが<= N; iが++ ){ 
    scanf関数(" %sの"、S + 1); 
    trie.insert(); 
  } 
  trie.getfail()。
  COUT << trie.dp()<< ENDL。
  リターン 0 ; 
}

 

おすすめ

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