struct node{int ch[LetterSize];// 儿子指针int sz[LetterSize];// 字典树大小}tree[TrieSize];//update(root[i-1],root[i]=++tot,s);voidupdate(int last,int cur,char* s){int len =strlen( str );for(int i =0; i < len ; i++){
tree[cur]= tree[last];//复制上一个版本int idx = s[i]-'a';// 获取字符编号
tree[cur].sz[idx]= tree[last].sz[idx]+1;
tree[cur].ch[idx]=++tot;
last = tree[last].ch[idx];
cur = tree[cur].ch[idx];}
tree[cur].sz[idx]= tree[last].sz[idx]+1;}boolquery(int l,int r,char*s){int len =strlen(s);for(int i =0; i < len;++i){int idx = s[i]-'a';int cnt = tree[r].sz[idx]- tree[l].sz[idx];if(!cnt)returnfalse;
l = tree[l].ch[idx];
r = tree[r].ch[idx];}returntrue;}
二进制常用版:
//update(root[i-1],root[i]=++tot,val);voidupdate(int last,int cur,int v){for(int i =31; i >=0; i--){
ch[cur][1]= ch[last][1];
ch[cur][0]= ch[last][0];
sz[cur]= sz[last]+1;int j =1&(v >> i);
ch[cur][j]=++tot;
cur = ch[cur][j];
last = ch[last][j];}
sz[cur]= sz[last]+1;}intquery(int last,int cur,int v){//返回和v区间异或最大值int ans =0;for(int i =31; i >=0; i--){int j =!(1&(v >> i));if(sz[ch[cur][j]]> sz[ch[last][j]]){
ans |=(1<< i);
last = ch[last][j];
cur = ch[cur][j];}else{
last = ch[last][!j];
cur = ch[cur][!j];}}return ans;}
一般字典树:void update(char *s){ int len=strlen(s); int rt=0; for(int i=0;i<len;i++){ int xb=s[i]-'a'; if(!tree[rt][xb])tree[rt][xb]=++tot; //tsize[tree[rt][xb]]++; ...