Trie Prefix Tree Dictionary tree
Examples of LA 3942 http://acm.hust.edu.cn/vjudge/problem/22109
The first example of a dictionary tree I use set water over, first record this version, test instructions is, give a string, there are some short strings of the collection, ask how many different splitting methods so that after splitting, each substring in the collection.
Dp[len] Indicates how many split methods before Len Dp[0]=1, the first 0 characters have a split method, empty. Dp[len] is the answer, the transfer is, if the next paragraph in the collection, then you can transfer to length plus the length of the paragraph.
Starting point has la=3e5,, to each starting point, add the string may have lbi=100, all to enumerate, next is to determine whether the string exists, with hash value, O1,set query Logn, n=4000, the overall complexity la*lb*logn drifting over.
1 //#define Txtout2 //#define DEBUG3#include <bits/stdc++.h>4 #defineMT (A, b) memset (A,b,sizeof (a))5 using namespacestd;6typedefLong LongLL;7 Const DoublePi=acos (-1.0);8 Const Doubleeps=1e-8;9 Const intinf=0x3f3f3f3f;Ten Const intm=3e5+Ten; One ConstLL mod=20071027; A classString_hash {///string Hash init o (n) query O (1) -typedef unsignedLong LongTypec;///hash value type - Static Const intmv=3e5+Ten;///string Length the Static Const intkey=137;///good choice of prime number of hash seed value - Typec H[MV],XP[MV]; - Public: - voidInitCharS[],intLS) {///incoming string array and string length +h[ls]=0; - for(inti=ls-1; i>=0; i--) { +h[i]=h[i+1]*key+S[i]; A } atxp[0]=1; - for(intI=1; i<=ls; i++) { -xp[i]=xp[i-1]*key; - } - } -TypecGet(intPosintLen) {///incoming initial position pos, string length len, return string hash value in returnh[pos]-h[pos+len]*Xp[len]; - } to }hash; + intN; - CharA[m]; the Charb[4010][ the]; * LL dp[m]; $ Set<unsignedLong Long>s;Panax Notoginseng intMax_len; - voidInit_set () { the s.clear (); +max_len=0; A for(intI=0; i<n; i++) { the intlb=strlen (B[i]); + Hash.init (b[i],lb); -S.insert (Hash.Get(0, LB)); $max_len=Max (max_len,lb); $ } - } - LL Solve () { the Init_set (); - intlen=strlen (a);Wuyi for(intI=0; i<=len; i++) { thedp[i]=0; - } Wudp[0]=1; - Hash.init (A,strlen (a)); About for(intI=0; i<len; i++) { $ if(dp[i]==0)Continue; - for(intj=0; j<max_len; J + +) { - if(!s.count (Hash).Get(i,j+1)))Continue; -dp[i+j+1]+=Dp[i]; Adp[i+j+1]%=MOD; + } the } - returnDp[len]; $ } the intMain () { the #ifdef txtout theFreopen ("In.txt","R", stdin); theFreopen ("OUT.txt","W", stdout); - #endif //Txtout in intcas=1; the while(~SCANF ("%s%d",a,&N)) { the for(intI=0; i<n; i++) { Aboutscanf"%s", B[i]); the } theprintf"Case %d:%lld\n", cas++, Solve ()); the } + return 0; -}
View Code
End
3.3 Strings (1)