hdu4287 字典树

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 10
struct trie
{
    trie *next[10];
    int sum;
    int flag;
};
trie *root;
char way[5010][10];
void init()
{
    root=(trie*)malloc(sizeof(trie));
    for(int i=2;i<10;i++)
        root->next[i]=NULL;
    root->flag=0;
    root->sum=0;
}
int check(char c)
{
    if(c>='a'&&c<='c')
        return 2;
    if(c>='d'&&c<='f')
        return 3;
    if(c>='g'&&c<='i')
        return 4;
    if(c>='j'&&c<='l')
        return 5;
    if(c>='m'&&c<='o')
        return 6;
    if(c>='p'&&c<='s')
        return 7;
    if(c>='t'&&c<='v')
        return 8;
    return 9;
}
void insert(char *s)
{
    int i,j,len=strlen(s);
    trie *p=root,*q;
    for(i=0;i<len;i++)
    {
        int id=check(s[i]);
        if(p->next[id]==NULL)
        {
            q=(trie*)malloc(sizeof(trie));
            for(j=2;j<10;j++)
                q->next[j]=NULL;
            q->flag=q->sum=0;
            p->next[id]=q;
        }
        p=p->next[id];
        p->sum++;
        if(i==len-1)
            p->flag++;
    }
}
int find(char *s)
{
    trie *p=root;
    int i,j,len=strlen(s);
    for(i=0;i<len;i++)
    {
        int id=s[i]-'0';
        if(p->next[id]==NULL)
            return 0;
        p=p->next[id];
    }
    return p->flag;
}
void freetrie(trie *root)
{
    int i,j;
    for(i=2;i<10;i++)
    {
        if(root->next[i]!=NULL)
            freetrie(root->next[i]);
    }
    free(root);
}
int main()
{
    int i,j,t,n,m;
    char s[maxn];
    scanf("%d",&t);
    while(t--)
    {
        init();
        scanf("%d %d",&n,&m);
        for(i=0;i<n;i++)
            scanf("%s",way[i]);
        for(i=0;i<m;i++)
        {
            scanf("%s",s);
            insert(s);
        }
        for(i=0;i<n;i++)
        {
            printf("%d\n",find(way[i]));
        }
        freetrie(root);
    }
}

 

posted @ 2015-08-12 16:26  sweat123  阅读(145)  评论(0编辑  收藏  举报