• Intelligent IME HDU


    题意:

    给你m个字符串,每一个字符对应一个数字,如下:

    2 : a, b, c    3 : d, e, f    4 : g, h, i    5 : j, k, l    6 : m, n, o     7 : p, q, r, s    8 : t, u, v    9 : w, x, y, z

    输入n个数字串,问这个数字串可以对应几个字符串

    比如ade这个字符串对应的数字串就是233

    题解:

    用这m个字符串建立一颗字典树,对于每一个节点维护一个变量val,他就代表(从树根到这个节点这一个数字串)有多少个对应的字符串

    每次插入的时候记录一下最大值就完了

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 using namespace std;
     7 typedef struct Trie* TrieNode;
     8 char s[130];
     9 char v[5005][10];
    10 struct Trie
    11 {
    12     int val;
    13     TrieNode next[8];
    14     Trie()
    15     {
    16         val = 0;
    17         memset(next,NULL,sizeof(next));
    18     }
    19 };
    20 
    21 void inserts(TrieNode root,char ss[10])
    22 {
    23     TrieNode p = root;  //建立的字典树是字符串对应的数字串
    24     int len=strlen(ss);
    25     for(int i=0;i<len;++i)
    26     {
    27         int temp=s[ss[i]];
    28         if(p->next[temp]==NULL) p->next[temp]=new struct Trie();
    29         p=p->next[temp];
    30     }
    31     p->val+=1;
    32 }
    33 
    34 int query(TrieNode root,char ss[10])
    35 {
    36     TrieNode p = root;
    37     int len=strlen(ss);
    38     for(int i=0;i<len;++i)
    39     {
    40         int temp=ss[i]-'0'-2;
    41         if(p->next[temp]==NULL)
    42         {
    43             //printf("%d**
    ",i);
    44             return 0;
    45         }
    46         else
    47         {
    48             p=p->next[temp];
    49         }
    50     }
    51     return p->val;
    52 }
    53 
    54 void Del(TrieNode root)
    55 {
    56     for(int i=0 ; i<8 ; ++i)
    57     {
    58         if(root->next[i])Del(root->next[i]);
    59     }
    60     delete(root);
    61 }
    62 
    63 int main()
    64 {
    65     s['a']=s['b']=s['c']=0;
    66     s['d']=s['e']=s['f']=1;
    67     s['g']=s['h']=s['i']=2;
    68     s['j']=s['k']=s['l']=3;
    69     s['m']=s['n']=s['o']=4;
    70     s['p']=s['q']=s['r']=s['s']=5;
    71     s['t']=s['u']=s['v']=6;
    72     s['w']=s['x']=s['y']=s['z']=7;
    73     int t,n,m;
    74     char ss[10];
    75     scanf("%d",&t);
    76     while(t--)
    77     {
    78         TrieNode root = new struct Trie();
    79         scanf("%d %d",&n,&m);
    80         for(int i=0 ; i<n ; ++i)
    81         {
    82             scanf("%s",v[i]);
    83         }
    84         for(int i=0 ; i<m ; ++i)
    85         {
    86             scanf("%s",ss);
    87             inserts(root,ss);
    88         }
    89         for(int i=0;i<n;++i)
    90         {
    91             printf("%d
    ",query(root,v[i]));
    92         }
    93         Del(root);
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    mint18
    ubuntu 安装mysql
    Linux awk 命令 说明
    shell EOF
    linux下使用lftp的小结
    MySQL的mysqldump工具的基本用法
    linux shell中 if else以及大于、小于、等于逻辑表达式介绍
    MySQL日期数据类型、时间类型使用总结
    linux 修改系统字符集,查看字符
    ORACLE基本用法及常用命令
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/12001362.html
Copyright © 2020-2023  润新知