字典樹

1

#include<iostream>
#include <cstdio>
#include <cstring>
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<iostream>
#include <cstdio>
#include <cstring>
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<iostream>
#include <cstdio>
#include <cstring>
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<n;i++){
            int u;scanf("%d",&u);
            insert(root,u,32);
        }
        printf("Case #%d:\n",cas);
        while(m--){
         int u;scanf("%d",&u);
         printf("%d\n",query(root,u,32));
        }
    }
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;    
int Trie[N][2]={0};
int num[N];
int tot=0;
template<typename T>
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];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章