zoukankan      html  css  js  c++  java
  • 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
    ",find(way[i]));
            }
            freetrie(root);
        }
    }
  • 相关阅读:
    C#反射
    做下一周计划
    OFFSET 函数
    微信跳一跳学习笔记
    跳一跳脚本代码搬运
    预测羽毛球赛成绩学习笔记
    将Python123中作业成绩绘制成雷达图
    Matplotlib库
    Numpy库
    第四周作业
  • 原文地址:https://www.cnblogs.com/sweat123/p/4724753.html
Copyright © 2011-2022 走看看