フェイス質問
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 ; }