1

#include
#include 
#include 
using namespace std;
#define me(a,x) memset(a,x,sizeof(a))
struct Trie{
    Trie *next[27];
    int num;
    Trie(){me(next,NULL);num=1;}
};
void insert(char *str,int n,Trie* &root){
    if(str[n]=='\0')return;
    int key=str[n]-'a';
    if(root->next[key]==NULL){
        root->next[key]=new Trie();
        insert(str,n+1,root->next[key]);
    }else {
        (root->next[key]->num)++;
        insert(str,n+1,root->next[key]);
    }
}
int query(char *str,Trie* root){
    Trie* p=root;
    int n=0;
    while(str[n++]){
        int key=str[n-1]-'a';
        if(p->next[key]==NULL)return 0;
        p=p->next[key];
    }
    return p->num;
}
void free_root(Trie* root){
    if(root==NULL)return;
    for(int i=0;i<26;i++)if(root->next[i])free_root(root->next[i]);
    delete(root);
}   
int main(){
    Trie *root=new Trie();
    char str[15];
    while(gets(str)&&str[0])insert(str,0,root);
    while(~scanf("%s",str))printf("%d\n",query(str,root));
    free_root(root);
}

2

#include
#include 
#include 
using namespace std;
#define me(a,x) memset(a,x,sizeof(a))
int Trie[1000005][26]={0};
int num[1000005]={0};
int tot=0;
void insert(char *str){
    int next=0,n=0;
    while(str[n++]){
        int key=str[n-1]-'a';
        if(Trie[next][key]==0)
        Trie[next][key]=++tot;
        num[Trie[next][key]]++;
        next=Trie[next][key];
    }
}
int query(char *str){
    int n=0,next=0;
    while(str[n++]){
        int key=str[n-1]-'a';
        if(Trie[next][key]==0)return 0;
        next=Trie[next][key];
    }return num[next];
}
int main(){
    char str[15];
    while(gets(str)&&str[0])insert(str);
    while(~scanf("%s",str))printf("%d\n",query(str));
}

01Trie

#include
#include 
#include 
using namespace std;
typedef long long ll;
#define me(a,x) memset(a,x,sizeof(a))
struct Trie{
    int val;
    Trie *next[2];
    Trie(){
        val=-1;
        next[0]=next[1]=NULL;
    }
};
void insert(Trie* &root,int x,int bit){
    if(bit==-1){root->val=x;return;}
    int key=(1ll*x>>bit)&1;
    if(root->next[key]==NULL)root->next[key]=new Trie();
    insert(root->next[key],x,bit-1);
}
int query(Trie* root,int x,int bit){
    if(bit==-1)return root->val;
    int key=(1ll*x>>bit)&1;
    if(root->next[key^1]!=NULL)return query(root->next[key^1],x,bit-1);
    else return query(root->next[key],x,bit-1);
}
int main(){
    int t;cin>>t;
    for(int cas=1;cas<=t;cas++){
        int n,m;
        scanf("%d%d",&n,&m);
        Trie *root=new Trie();
        for(int i=0;i
#include
using namespace std;
const int N=1e5;    
int Trie[N][2]={0};
int num[N];
int tot=0;
template
struct Tree{
    void insert(T x){
        int next=0;
        for(int i=32;~i;i--){
            int key=(1ll*x>>i)&1;
            if(Trie[next][key]==0)Trie[next][key]=++tot;
            next=Trie[next][key];
        }
        num[next]=x;
    }
    T query(T x){
        int next=0;
        for(int i=32;~i;i--){
            int key=(1ll*x>>i)&1;
            if(Trie[next][key^1])next=Trie[next][key^1];
            else next=Trie[next][key];
        }
        return num[next];
    }
};
  • 可持久化01字典树
    #include
    #define me(a,x) memset(a,x,sizeof(a))
    #define scnaf scanf 
    #define itn int
    using namespace std;
    const int o_o=1e5+5;
    const int mod=1e9+7;
    const int oo=0x7fffffff;
    const int sup=0x80000000;
    typedef long long ll;
    typedef unsigned long long ull;
    int n,m,cnt=0,tot=0;
    int Trie[o_o*40][2];
    int st[o_o],ed[o_o],node[o_o];
    int num[o_o*40],root[o_o*40];
    int T[o_o*40];
    vectorg[o_o];
    void insert(int u,int fa,int val){
    int flag=0;
    for(int i=30;~i;i--){
        int key=val>>i&1;
        Trie[u][key]=++tot;
        if(!flag&&Trie[fa][key^1])Trie[u][key^1]=Trie[fa][key^1];
        if(flag){
            num[Trie[u][key]]++;
            u=Trie[u][key];
        }else{
            if(Trie[fa][key]){
                num[Trie[u][key]]=num[Trie[fa][key]]+1;
                u=Trie[u][key],fa=Trie[fa][key];
            }else{
                flag=1;
                num[Trie[u][key]]++;
                u=Trie[u][key];
            }
        }
    }
    root[u]=val;
    }
    int Q(int L,int R,int x){
    int flag=0;
    for(int i=30;~i;--i){
        int key=x>>i&1;
        if(flag){
            if(Trie[R][key^1])R=Trie[R][key^1];
            else R=Trie[R][key];
        }else{   
            if(Trie[R][key^1]){
                if(Trie[L][key^1]){
                    int cal=num[Trie[R][key^1]]-num[Trie[L][key^1]];
                    if(cal>0)R=Trie[R][key^1],L=Trie[L][key^1];
                    else R=Trie[R][key],L=Trie[L][key];
                }
                else{
                    R=Trie[R][key^1];
                    flag=1;
                }
            }else{
                R=Trie[R][key];
                if(Trie[L][key])L=Trie[L][key];else flag=1;
            }
        }
    }
    return x^root[R];
    }
    void dfs(int u){
    st[u]=++cnt;
    T[cnt]=++tot;
    insert(T[cnt],T[cnt-1],node[u]);
    for(auto v:g[u])dfs(v);
    ed[u]=cnt;
    }
    int main(){
    while(~scanf("%d%d",&n,&m)){
        me(Trie,0);
        cnt=tot=T[0]=num[0]=0;
        for(int i=1;i<=n;i++){
            g[i].clear();
            num[i]=0;
            root[i]=0;
            T[i]=0,st[i]=0,ed[i]=0;
            scnaf("%d",node+i);
        }
        for(int i=1;i