[羅区P3796] [説明] [テンプレート] ACオートマトン

AC自動機の基礎については推薦yybのブログを

あなたはまだ私のような言葉を読み取ることができない場合は一日中食べ Jiuhaolaを考えてマップを描画するための

AC自動機がマルチモードマッチングアルゴリズムは、彼が等しいKMP +トライ構造を考え、実際には(いずれにせよ、それは無意味であろう)

この質問は、主にするとき、タグの終了と順番を覚えていることができ、統計答えに注意を払うされたときに、統計的な答えを記録するための構造

そして、多くのデータセットがありますされているクリア(私はANS WAをn回クリアしていないため)

コード:( とyybコードの類似性は、すべての後、学校の井戸を見て

1の#include <ビット/ STDC ++ H.>
 2  の#defineデバッグCOUT << "AK IOI AJH !!!" << ENDL
 3。 使用した 名前空間STD;
 4  int型CNT、N-;
 5   SS [ 160 ];
 6  構造体ノード{
 7      INT失敗、ED、息子[ 26である];
 8 } TR [ 100 510 ];
 9件の 構造体回答{ // 統計答え、CTが発生回数、IDX番号(出力)である
10      INT CT、IDX;
 11 } ANS [ 100 510 ];
 12は、インラインBOOLCMP(ANS、アンスB){
 13      であれば(a.ct == b.ct)リターン a.idx < b.idx。
14      リターン a.ct> b.ct。
15  }
 16インラインボイドクリア(INT 今){
 17      TR [今] .ED = 0 18      TR [今] .fail = 0 19      のmemset(TR [今] .son、0はsizeof (TR [今] .son))。
20  }
 21インラインボイド挿入(ストリング S、INT nownum){
 22      、INTs.length = LEN()、今= 0 、TMPは、
 23である     ためINT I = 0 ; I <LEN; I ++ ){
 24          TMP = S [I] - [ A ' ;
 25          IF(![今] TR。息子[TMP]){
 26は              TR [今] .son [TMP] CNTは= ++; // クリアするように注意AC動作基づいオートマトン、
27              クリア(CNT)を;
 28          }
 29          今や= TR [今] .son [ TMP];
 30      }
 31であり      ; TR [今] .ED = nownum // レコードオーダーワード
32  }
 33がインラインボイド失敗(){
 34      キュー< INT > Q。
35      のためにINT iは= 0 ; I < 26 ; I ++ ){
 36          であれば(TR [ 0 ] .son [I]){
 37              TR [TR [ 0 ] .son [I] =失敗。0 38              q.push(TR [ 0 ] .son [I])。
39          }
 40      }
 41      ながら(!{q.empty())
 42          INT今= q.front()。
43          q.pop()。
44          のためののInt I = 0 ; I < 26であり ; I ++ ){
 45              IF (TR [今] .son [I]){
 46である                  。TR [TR [今] .son [I] =失敗TR [TR [今]。失敗] .son [i]は、
 47                  // 非常に巧妙な操作、最高のジャンプを回避するためにステップバイステップ
 48                  //は、(実際に、私は、コードのバックアップのこの素晴らしいラインを知って取得していない)理由を考えることができます
49                  q.push (TR [今] .son [I]);
 50              } {
 51は                  TR [今] .son [I] = TR [TR [今] .fail] .son [I];
 52である             }
 53である         }
 54である     }
 55  }
 56インラインボイド検索(ストリングS){
 57      INT LEN = s.length()、今= 0 、TMP。
58      のためにINTは iは= 0 ; I <LEN; I ++ ){
 59          のTMP = S [I] - ' ' 60          今= TR [今] .son [TMP]。
61 のためにINT ; J; J =今J = T R [J] .fail){
 62              ANS [TR [J] .ED] .CT ++。// 找完一个单词记到ANS里63         }
 64     }
 65 }
 66 INT メイン(){
 67         
           一方、114 514){ // ビット臭いがあってもよい
68          CIN >> N-、
 69          IF(N - == 0BREAK ;
 70          クリア(0 );
 71が          CNT = 0 ;
 72          のためにINT I = 1 ; I <= N- ; I ++ ){
 73が              CIN >> SS [I];
 74              ANS [I] CT = 0 ; // 原因この文私半分WA 
75              ANS [I] .IDX = I;
 76              インサート(SS [I]、 I);
77          }
 78          失敗()。
79          CIN >> SS [ 0 ]。
80          検索(SS [ 0 ])。
81          ソート(ANS + 1、ANS + N + 1 、CMP)。
82          // 输出结果
83          COUT << ANS [ 1 ] .CT << ENDL。
84          COUT << SS [ANS [ 1 ] .IDX] << ENDL。
85          のためにINT iは= 2 ; iが<= N; I ++ ){
 86              であれば(ANS [I] .CT == ANS [I- 1 ] .CT){
 87                 << SS COUT [ANS [I]の.idx] << てendl;
 88              }  BREAK ;
 89          }
 90          ///////// / 
91である     }
 92      リターン 0 ; // メリットいっぱいの公園
93 }

 

おすすめ

転載: www.cnblogs.com/juruoajh/p/12238826.html