キーワード検索(AC自動マシンテンプレートのタイトル)

問題の説明
現代の時間では、検索エンジンはグーグルなど、百度、などの皆様の生活に入って来た
Wiskeyも彼のイメージ検索システムにこの機能を持って望んでいます。
すべての画像は、ユーザーが画像を見つけるためにいくつかのキーワードを入力すると、システムがイメージの説明をキーワードに一致し、ほとんどのキーワードが一致する画像が表示されます、長い説明があります。
あなたのイメージの説明、およびいくつかのキーワードを与え、問題を単純化するために、あなたはどのように多くのキーワードが一致するだろう私に教えてください。
 

 

入力
最初の行は1つの整数によって従いますどのように多くの場合意味が含まれます。
各ケースはNキーワードの数を意味し、N個のキーワードが続く2つの整数を含んでいます。(N <= 10000)
各キーワードは、文字「A」が含まれます- 「Z」を、長さが50よりも長くしないであろう
最後の行が記述され、そして長さが1000000よりも長くしないであろう。
 

 

出力
説明に含まれているどのように多くのキーワードを印刷します。
 

 

サンプル入力
1 5彼女は彼が彼女のyasherhs SHR言います
 

 

サンプル出力
3
 

 

著者
Wiskey
 

 

推薦します
LCY | 我々は慎重にあなたのためのいくつかの同様の問題を選択している:   3065   2243   2825   3341   3247 

 

 

 

1の#include <stdio.hの>
 2の#include <iostreamの>
 3の#include <アルゴリズム>
 4の#include < 文字列・H>
 5の#include <STDLIB.H>
 6の#include <math.h>の
 7の#include <キュー>
 8の#include < 設定 >
 9  
10  の#define 0x3f3f3f3f INF
 11  の#define PII対<整数、整数>
 12  使用 名前空間STDを、
13  のconst  int型 MAXN = 1E6 + 10 14  
15  CHAR ; MAXN] BUF
16 構造体ac_automation {
 17      INT次の[MAXN] [ 26 ]、[MAXN] [MAXN]、終了に失敗し、
18      INTの根、L。
19      int型newnode(){
 20          のためにint型 i = 0 ; iは< 26 ; iは++ 21          {
 22              次の[L] [I] = - 1 23          }
 24          端[L ++] = 0 ;
25          リターン L- 1 26      }
 27      ボイドのinit(){
 28         L = 0 29          ルート= newnode()。
30      }
 31      空隙インサート(CHAR BUF []){
 32          INT LEN = STRLEN(BUF)。
33          int型になりました= ルート。
34          のためには、int型 = Iを0 ; iがLEN <; iは++ ){
 35              であれば(次の[今] [BUF [I] - ' ' ] == - 1 36                  次の[今] [BUF [I] - [ ' ] = newnode()。
37             今=次の[今] [BUF [I] - ' ' ]。
38         }
 39          終わり[今や] ++ ;
40     }
 41 空隙ビルド(){
 42          キュー< INT > Q。
43          [ルート] =失敗ルートと、
44 のためにint型 I = 0 ; iが< 26 ; iが++ 45         {
 46の場合(次の[ルート] [I] == - 1 47                  次の[ルート] [I] = 根。
48                                            {
 49                  [次の[ルート] [I] =失敗ルートと、
50                  Q.push(次の[ルート] [I])。
51              }
 52          }
 53          ながら(!Q.empty()){
 54              INT今= Q.front()。
55              Q.pop()。
56              のためには、int型 i = 0 ; iは< 26 ; iは++ ){
 57                  であれば(次の[今] [I] == - 1 58                      次の[今] [I] = 次の[失敗[今] [I];
59                  他に{
 60                     失敗[次の[今] [I] = 次の[I] [今] [失敗]。
61                      Q.push(次の[今] [I])。
62                  }
 63              }
 64          }
 65      }
 66      INT querry(CHAR BUF []){
 67          INT LEN = STRLEN(BUF)。
68          int型になりました= ルート。
69の         int型の RES = 0 ;
70          のためにint型 I = 0 ; iがLEN <I ++は{)
 71              -今=次の[今] [I] [BUF ' A" ];
72              int型温度= 今;
73              ながら(!TEMP = ルート){
 74の                  RES + = 終わり[TEMP]。
75                  エンド[TEMP] = 0 ;
76                  TEMP = [TEMP]を失敗。
77              }
 78          }
 79の         リターンRES。
80      }
 81  } AC。
82  
83  INT メイン(){
 84      のint T。
85      のscanf(" %dの"、&T)。
86     一方、(T-- ){
 87          INT N。
88          のscanf(" %d個"、&N)
89          ac.init()。
90          のためにint型 I = 0 ; iがN <I ++は{)
 91              のscanf(" %sの" 、BUF)。
92              ac.insert(BUF)。
93          }
 94          ac.build()。
95          のscanf(" %sの" 、BUF)。
96          のprintf(" %d個の\ n "、ac.querry(BUF))。
97      }
 98      リターン 0 99 }

 

おすすめ

転載: www.cnblogs.com/-Ackerman/p/11324266.html
おすすめ