南昌インビテーショナルのタイトル、辞書ツリー
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 LL [ 26 ]。 ストリング S [ 100005 ]。 LLトライ[ 200008 ] [ 26 ]。 LLのV [ 200005 ]。 LL TOT = 1 。 LLのCNT [ 200005 ]。 LLのB [ 100005 ]。 LL N、MOD。 ボイドインサート(ストリング S、INT X) { int型、P = 1 。 int型のlen =s.length(); LL T = 1 。 以下のために(int型 i = 0 ; iがLEN <; iは++ ){ T =(T *とのA [S [I] - [ A ' ])%MOD。 もし(トライ[P] [S [i]は- ' ' ] == 0 ){ トライ[P] [S [I] - ' ' ] = ++ TOT。 } P =トライ[P] [S [I] - ' ' ]。 CNT [P] ++ ; V [P]は = Tと、 } B [X]= T。 } LL ANS = 0 。 ボイド検索(ストリング S、INT X) { int型、P = 1 。 INT LEN = s.length()。 以下のために(int型 i = 0 ; iがLEN <; iは++ ){ P =トライ[P] [S [I] - ' ' ]。 もし(V [P]> B [X]){ ANS + = CNT [P]。 } } } int型のmain() { scanf関数( " %の%のLLD LLD "、&N、&MOD)。 以下のために(int型私= 0 ; iが< 26 ; iが++ ){ scanf関数(" %のLLD "、&A [I])。 } のために(int型 i = 0 ; iがn <; iは++ ){ CIN >> S [i]は、 (S [i]は、I)を挿入します。 } のために(int型 i = 0 ; iがn <; iは++ ){ 検索(S [i]は、I)。 coutの << ANS << ' ' ;0 ; } }