タイトル説明は
、N個の列が与えられるとS_ {} 1を、S_ {N-2} ...} S_ {ののS 1 、S 2 。。。S N- 、次の問い合わせM回、所与のクエリに対する各時間多くのTが文字列の接頭辞であるか、文字列T、S1〜Snを見つけます。入力文字列の全長は小文字のみを含む、^ 6〜10以下です。
入力説明:
二つの整数N、Mの最初の行 次に、N線S1のストリング。ストリングクエリによって表される次のMライン毎。
出力説明は:
それぞれのお問い合わせは、出力は整数の答えを表し
アイデア:
接頭文字列を参照するには、我々は辞書ツリーを考えなければならない、と辞書プレフィックスツリーの木の辞書には、この質問は、私が言うことは何もない古典的な一つの質問です。
完全なC ++ ACコードのバージョン:
書式#include <iostreamの> の#include <アルゴリズム> 使用して名前空間はstdを、const int型 N = 1000010 ; INTのN、M。 int型の息子[N] [ 26 ]、CNT [N]、IDX。 チャーSTR [N]。ボイド挿入(){ int型、P = 0 。 以下のために(int型私= 0 ; [I]をstr; iが++ ){ int型 S = STR [I] - [ A ' 。 もし息子[P] [S] = ++(息子[P] [S]!)IDX。 P = 息子[P] [S]。 } CNT [P] ++ ; } int型の検索(){ int型、P = 0、ANS = 0 。 以下のために(int型私= 0 ; [I]をstr; iが++ ){ int型 S = STR [I] - [ A ' 。 もし(!息子[P] [S])ブレーク。 P = 息子[P] [S]。 ANS + = CNT [P]。 } 戻りANS。 } int型のmain(){ IOS :: sync_with_stdio。 CIN >> N >> M。 一方、(N-- ){ CIN >> STR。 インサート(); } 一方(M-- ){ CIN >> STR。 int型 ANS = 検索(); coutの << ANS << てendl; } 戻り 0 。 }