HDU 1298 T9 (字典树模板题)
2017-08-10 20:02
441 查看
题目地址
题意:就是你用T9打字,然后会给你一些记忆单词,每个单词有着匹配优先级(然后注意一个点,如果有重复的前缀,对于前缀的优先级是叠加的)例如:
he 2
hehe 3
那么he的优先数应该是5
(就是这个点让我重新写了一遍代码,因为我之前是用数字去匹配的,对于优先数叠加是没有办法处理的)
思路:就是用字典树去维护,按数字对应的字母dfs(详细看代码)
题意:就是你用T9打字,然后会给你一些记忆单词,每个单词有着匹配优先级(然后注意一个点,如果有重复的前缀,对于前缀的优先级是叠加的)例如:
he 2
hehe 3
那么he的优先数应该是5
(就是这个点让我重新写了一遍代码,因为我之前是用数字去匹配的,对于优先数叠加是没有办法处理的)
思路:就是用字典树去维护,按数字对应的字母dfs(详细看代码)
#include <iostream> #include <cstring> #include <string> #include <queue> #include <vector> #include <map> #include <set> #include <stack> #include <cmath> #include <cstdio> #include <algorithm> #define N 200010 #define LL __int64 #define inf 0x3f3f3f3f #define lson l,mid,ans<<1 #define rson mid+1,r,ans<<1|1 #define getMid (l+r)>>1 #define movel ans<<1 #define mover ans<<1|1 using namespace std; struct node { node *next[26]; 4000 int good; void init() { for (int i = 0; i < 26; i++) { next[i] = NULL; } good = 0; } }root; int m[10] = { 0,0,3,3,3,3,3,4,3,4 };//表示按键i有几个字符 char ch[10][5] = { "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" }; void Free(node *p) { for (int i = 0; i<26; ++i)if (p->next[i])Free(p->next[i]); delete p; } int sum; string temp, str; void dfs(int k, int len, node *p, string a) { if (k == len) { if (p->good > sum) { sum = p->good; temp = a; } return; } int kk = str[k] - '0'; for (int i = 0; i < m[kk]; i++) { if (p->next[ch[kk][i] - 'a']) { dfs(k + 1, len, p->next[ch[kk][i] - 'a'], a + ch[kk][i]); } } } int main() { cin.sync_with_stdio(false); int T, n, m; node *p; cin >> T; int Case = 1; while (T--) { cout << "Scenario #" << Case++ << ":" << endl; cin >> n; root.init(); while (n--) { cin >> str >> m; p = &root; for (int i = 0; i < str.length(); i++) { int k = str[i] - 'a'; if (p->next[k] == NULL) { p->next[k] = new node; p->next[k]->init(); } p = p->next[k]; p->good += m; } } cin >> n; for (int kk = 0; kk < n; kk++) { cin >> str; for (int i = 1; i < str.length(); i++) { sum = 0; dfs(0, i, &root, "\0"); if (sum) { cout << temp << endl; } else { cout << "MANUALLY" << endl; } } cout << endl; } for (int i = 0; i<26; ++i) { if (root.next[i])Free(root.next[i]); root.next[i] = NULL; } cout << endl; } return 0; }
相关文章推荐
- HDU 1298 T9 // 字典树,枚举,dfs
- hdu 题目1298 T9(字典树)
- hdu 1298 T9(字典树+DFS)
- HDU - 1298 T9(字典树+dfs)
- HDU 1298 T9(字典树+dfs)
- T9 (HDU_1298,POJ_1451) 字典树 + DFS
- hdu 1298 字典树 + DFS (模拟T9文本输入)
- hdu 1298 T9 字典树 dfs
- Hdu1298 - T9 - 字典树
- [字典树] hdu 1298 poj 1451 T9
- HDU 1298 T9(字典树+DFS)
- HDU 1298 T9(字典树的经典应用)
- [字典树 + dfs] HDU 1298 - T9
- HDU--1298 -- T9 [字典树+深搜]
- (HDU)1298 (POJ)1451 - T9 【字典树】+【DFS】
- hdu-1298 T9(字典树+DFS)
- HDU-1298 T9 字典树 DFS
- HDOJ1298(T9) 字典树 + dfs
- hdu 1251 字典树模板题 ---多串 查找单词出现次数
- 【HDU】 1298 T9