問題の解決策|「アルゴリズムコンテストステップアップガイド」プレフィックス統計

タイトル説明は
、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 
}

 

おすすめ

転載: www.cnblogs.com/Mashiro-zBlog/p/11433436.html