Trie模板

来源:互联网 发布:看电视去广告软件 编辑:程序博客网 时间:2024/06/01 08:10

简单trie:
http://hihocoder.com/problemset/problem/1014

// http://hihocoder.com/problemset/problem/1014#include<bits/stdc++.h>#define pb push_back #define mp make_pairusing namespace std;const int maxn=1e5+7;typedef long long ll;struct trie{    const static int maxnode=1e6+7;    const static int sigma_size=26;    int ch[maxnode][sigma_size];    int val[maxnode];    int sz;    void init()    {        sz=1;        memset(ch[0],0,sizeof(ch[0]));    }    int id(char c)    {        return c-'a';    }    void insert(char *s)    {        int i,j,len=strlen(s);        int u=0;        for(i=0;i<len;++i)        {            int c=id(s[i]);            if(!ch[u][c])            {                   memset(ch[sz],0,sizeof(ch[sz]));                val[sz]=0;                ch[u][c]=sz++;            }            u=ch[u][c];            val[u]++;        }    }    int find(char *s)    {        int i,j,len=strlen(s);        int u=0;        for(i=0;i<len;++i)        {            int c=id(s[i]);            if(!ch[u][c]) return 0;            u=ch[u][c];        }        return val[u];    }}trie;int n,m,ans;char s[maxn];void doit(){    int i,j,k;    trie.init();    cin>>n;    for(i=1;i<=n;++i)    {        scanf("%s",s);        trie.insert(s);    }    cin>>m;    for(i=0;i<m;++i)    {        scanf("%s",s);        printf("%d\n",trie.find(s));    }    return;}int main(){    int i,j,k,T;    doit();    return 0;}

一些细节:
1.init函数要注意ch数组只清ch【0】,之后每建一个节点,清一个节点的子节点和节点信息(val)
2.注意sz的初始化和改变(sz++)

—–

01trie:
http://acm.uestc.edu.cn/#/problem/show/1582

// http://acm.uestc.edu.cn/#/problem/show/1582#include<bits/stdc++.h>#define pb push_back #define mp make_pairusing namespace std;const int maxn=1;typedef long long ll;struct Trie{    const static int Maxn=4e6+7;    int ch[Maxn][2],sz,val[Maxn];    void init()    {        sz=1;        memset(ch[0],0,sizeof(ch[0]));    }    void insert(int now)    {        int u=0;        for(int i=30;i>=0;--i)        {            int c=(now>>i)&1;            if(!ch[u][c])            {                memset(ch[sz],0,sizeof(ch[sz]));                val[sz]=0;                ch[u][c]=sz++;            }            u=ch[u][c];        }        val[u]=now;    }    int search(int now)    {        int u=0;        for(int i=30;i>=0;--i)        {            int c=(now>>i)&1;            if(ch[u][c^1])            {                u=ch[u][c^1];            }            else            {                u=ch[u][c];            }        }        return now^val[u];    }}trie;int n,m;/* string trans(int now){    string a="";    for(int i=0;i<31;++i)    {        char c=now%2+'0';        a=c+a;        now/=2;    }    return a;}*/ int main(){    int i,j,k,T;    trie.init();    scanf("%d",&n);    for(i=1;i<=n;++i)    {        scanf("%d",&j);        trie.insert(j);    }    scanf("%d",&m);    for(i=1;i<=m;++i)    {        scanf("%d",&j);        printf("%d\n",trie.search(j));    }    return 0;}

一些细节:
1.普通trie的注意
2.用位运算而不用字符串,效率提高约5倍

——–

原创粉丝点击