Trie树

来源:互联网 发布:淘宝pos机 编辑:程序博客网 时间:2024/06/08 07:06
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int maxnode=4000*100+10;const int MAXN=300;const int MAXM=1000;const int sigma_size=26;struct Trie{    int ch[maxnode][sigma_size];    int val[maxnode];    int sz;//结点总数    Trie(){sz=1;memset(ch[0],0,sizeof(ch[0]));}//初始只有一个根节点    int idx(char c) {return c-'a';}//字符c的编号    //插入字符串s,附加信息为v。注意v必须非0,因为0代表”本结点不是单词结点“    void Insert(char *s,int v)    {        int u=0,n=strlen(s);        for(int i=0;i<n;++i)        {            int c=idx(s[i]);            if(!ch[u][c])//结点不存在            {                memset(ch[sz],0,sizeof(ch[sz]));                val[sz]=0;//中间结点的附加信息为0                ch[u][c]=sz++;//新建结点            }            u=ch[u][c];//往下走        }        val[u]=v;//字符串的最后一个字符的附加信息为v    }    int query(char *s)    {         int len=strlen(s);         int u=0;         for(int i=0;i<len;++i)         {             int id=idx(s[i]);             if(ch[u][id]==0) return 0;             u=ch[u][id];         }         return val[u];    }};Trie trie;char word[MAXN];char text[MAXM];int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(int i=1;i<=n;++i)        {            scanf("%s",word);            trie.Insert(word,i);        }        for(int i=1;i<=m;++i)        {            scanf("%s",word);            printf("%d\n",trie.query(word));        }    }    return 0;}
原创粉丝点击