トピックポータル
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、1、1 )。 } scanf関数(" %のD "、およびQQ)。 以下のために(int型 I = 1 ; I <= QQ、iは++ ){ scanf関数(" %sの" 、S); t2.insert(S、I、2 )。 } マージ(0、0、0 、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未満ですが、方法ゲームも悪いアイデアではありません、このような憶測場合。オンライン辞書は、分類の文言を議論するために別のツリーを参照してください