牛オフ - リーガルカイ文字列と一致する(ビット集合)

トピックポータル

SOL1:維持するためにビットセットで、実際には、非常に暴力的な感じ、この質問について学ぶことで、ビットセットを使用する可能性はありません。

  • ビットセット暴力のメンテナンス
    #include " ビット/ STDC ++ H " 
    の#defineデバッグプット( "何だ一体")。
    使用して 名前空間はstdを、
    const  int型 MAXN = 1010 ;
    チャーS [MAXN]。
    ビット集合 < 1010 > BS [ 2 ] [MAXN]。
    INT のmain(){
         int型N、M、Q。
        scanf関数(" %d個の%のD "、&​​N、&M)。
        以下のためにint型 i = 1 ; iが++; iが<= N ){
            scanf関数(" %sの"、S + 1 )。
            INT J = 1 ; S [j]は、J ++ 
                BS [P [J] ^ ' 0 ' ] [j]は[I] = 1 
        }
        scanf関数(" %のD "、&Q)。
        以下のためにint型 I = 1 ; I <= Q; iは++ ){
            scanf関数(" %sの"、S + 1 )。
            ビットセット < 1010 > のres;
            RES。セット()。
            INTの J = 1 ; S [j]は、J ++ ){
                 もし、(S [j] == ' _ '続けます
                RES&= BS [S [J] ^ ' 0 ' ] [J]。
            }
            printf(" %d個の\ n " 、res.count())。
        }
        リターン 0 ;
    }

     

SOL2:この問題をやって起動、我々は辞書ツリーのマッチング考える上でどのように多くの文字列を参照してください、まだタイムアウトを最適化し続けることができます。その後でネチズンは、辞書の木、その後試合を開くには、二つの方法を学びました。

  • トライ
    #include " ビット/ STDC ++ H。" 
    使用 名前空間STDを、
    #defineデバッグプット(「何だ一体」)。
    typedefの長い 長いLL。
    typedefのペア < int型int型 > PII。
    const  int型 INF = 0x3f3f3f3f const  int型 MOD = 1E9 + 7 const  int型 MAXNODE = 3E6 + 10 const  int型 MAXN = 3010 ;
    int型CNT [MAXNODE]、[MAXNODE] ANS;
    int型のres [MAXN]。
    ベクター < INT > Q [MAXNODE]。
    構造体トライ{
         int型の息子[MAXNODE] [ 3 ]。
        int型のTOT;
        のインサート(のchar * sで、int型の V、int型OP){
     //         プット(複数可)。
            int型のp = 0 ;
            以下のためにint型 I = 0、S [i]は、iは++ ){
                 int型の IDは=(S [I] == ' _ ')?2:S [I] ^ ' 0 ' もし息子[P] [ID] = ++(息子[P] [ID]!)TOT。
                P = 息子[P] [ID]。
    //             のprintf( "\ T%D%C"、P、S [I])。
            }
     //         プット( "")。
            もし(OP == 1)CNT [P] + = V。
            Q [P] .push_back(V)。
        }
    } T1、T2。
    チャーS [MAXN]。
    ボイドマージ(INT P1、INT P2、INT P、INT M){
         場合(Pの==のM){
            ANS [P2] + = CNT [P1]。
    //         のprintf( "\ T%D%D \ n"は、P1、P2)。
            返します
        }
        もし(t2.son [P2] [ 0 ] && t1.son [P1] [ 0 ])マージ(t1.son [P1] [ 0 ]、t2.son [P2] [ 0 ]、P + 1 、m)と;
        もし(t2.son [P2] [ 1 ] && t1.son [P1] [ 1 ])マージ(t1.son [P1] [ 1 ]、t2.son [P2] [ 1 ]、P + 1 、m)と;
        もし(t2.son [P2] [ 2 ]){
             場合(t1.son [P1] [ 0 ])マージ(t1.son [P1] [ 0 ]、t2.son [P2] [ 2 ]、P + 1 、M)。
            もし(t1.son [P1] [ 1 ])マージ(t1.son [P1] [1 ]、t2.son [P2] [ 2 ]、P + 1 、M);
        }
    }
    INT のmain(){
         int型N、M、QQ。
        scanf関数(" %d個の%のD "、&​​N、&M)。
        以下のためにint型 i = 1 ; iが++; iが<= N ){
            scanf関数(" %sの" 、S);
            t1.insert(S、11 )。
        }
        scanf関数(" %のD "、およびQQ)。
        以下のためにint型 I = 1 ; I <= QQ、iは++ ){
            scanf関数(" %sの" 、S);
            t2.insert(S、I、2 )。
        }
        マージ(000 、M);
        以下のためにint型 I = 1 ; I <= t2.tot; iは++ ){
             ための(自動インデックス:Q [I]){
                RES [インデックス] =のANS [I]。
            }
        }
        以下のためにint型 I = 1 ; I <= QQ、iは++ 
            printf(" %d個の\ n " 、RES [I])。
        リターン 0 ;
    }

    コード素晴らしい試合後のオフラインアップは限り2は、サイドトライを実行していたように、2つの複雑さは、辞書ツリー内のノードの数でなければなりません。尋問の数は「_」カードデータに感じ、暴力の使用に20未満ですが、方法ゲームも悪いアイデアではありません、このような憶測場合。オンライン辞書は、分類の文言を議論するために別のツリーを参照してください

おすすめ

転載: www.cnblogs.com/Angel-Demon/p/11666320.html