• HDU 1298 T9(字典树+dfs)


    http://acm.hdu.edu.cn/showproblem.php?pid=1298

    题意:
    模拟手机9键,给出每个单词的使用频率。现在给出按键的顺序,问每次按键后首字是什么(也就是要概率最大的)。

    思路:

    先建立字典树算出每个前缀出现的概率,然后dfs每种情况,选择概率大的。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 const int maxn = 1000*1000+5;
     6 
     7 char s[105],ans[105],tmp[105];
     8 
     9 int n, num = 0, p;
    10 int pheno[8][4] = {{0,1,2},{3,4,5},{6,7,8},{9,10,11},{12,13,14},{15,16,17,18},{19,20,21},{22,23,24,25}};
    11 int key[8] = {3,3,3,3,3,4,3,4};
    12 
    13 struct Trie
    14 {
    15     int son[26];
    16     int cnt;
    17 }t[maxn];
    18 
    19 void init(int x)
    20 {
    21     t[x].cnt = 0;
    22     memset(t[x].son,0,sizeof(t[x].son));
    23 }
    24 
    25 void insert(char* s, int d)
    26 {
    27     int u = 0, n = strlen(s);
    28     for(int i=0;i<n;i++)
    29     {
    30         int c = s[i]-'a';
    31         if(!t[u].son[c])
    32         {
    33             num++;
    34             init(num);
    35             t[u].son[c] = num;
    36         }
    37         u = t[u].son[c];
    38         t[u].cnt += d;
    39     }
    40 }
    41 
    42 void dfs(int cur, int u, int len, char* s)
    43 {
    44      if(cur == len)
    45      {
    46          if(t[u].cnt > p)
    47          {
    48              p = t[u].cnt;
    49              for(int i=0;i<len;i++)  ans[i] = tmp[i];
    50              ans[len] = '';
    51          }
    52          return;
    53      }
    54      int k = s[cur]-'2';
    55      for(int i=0;i<key[k];i++)
    56      {
    57          int c = pheno[k][i];
    58          if(!t[u].son[c])  continue;
    59          tmp[cur] = 'a'+ c;
    60          dfs(cur+1, t[u].son[c], len, s);
    61      }
    62 }
    63 
    64 int main()
    65 {
    66     //freopen("in.txt","r",stdin);
    67     int T;
    68     scanf("%d",&T);
    69     int kase = 0;
    70     while(T--)
    71     {
    72         init(0);
    73         scanf("%d",&n);
    74         for(int i =0;i<n;i++)
    75         {
    76             scanf("%s%d",s,&p);
    77             insert(s,p);
    78         }
    79         printf("Scenario #%d:
    ",++kase);
    80         int q; scanf("%d",&q);
    81         while(q--)
    82         {
    83             scanf("%s",&s);
    84             int len = strlen(s);
    85             for(int i=0;i<len-1;i++)
    86             {
    87                 p = 0;
    88                 dfs(0,0,i+1,s);
    89                 if(p)  printf("%s
    ",ans);
    90                 else puts("MANUALLY");
    91             }
    92             if(q)  puts("");
    93         }
    94         printf("
    
    ");
    95     }
    96     return 0;
    97 }
  • 相关阅读:
    题解:艾米利亚的魔法
    tarjan求割点
    集合删数
    小测题解
    [考试]20141028
    铺地毯
    [考试]20141027
    大家好
    【DM642学习笔记一】关于Can't Initialize Target CPU的一种解决方法 : Error 0x80000240
    iOS开发之获取系统相册ALAssetLibrary
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/7892556.html
Copyright © 2020-2023  润新知