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 - == 0)BREAK ; 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 }