ural 1542 字典树(思维)
2016-09-12 10:47
316 查看
题目:http://acm.timus.ru/problem.aspx?space=1&num=1542
题意:
给出n个单词和各自出现的频率,然后给出m个某些单词的开头,要求找出频率最高不超过10个的以这些字符串开头的单词。
分析:
显然是字典树的题目,如果把单词建字典树,然后对于每个开头字符串,都查询一遍字典树,显然会超时。
所以逆向思考一下,把开头字符串建立字典树,然后查询每个单词,每个开头字符串找出不超过10个单词,这样就很容易实现了~~
题意:
给出n个单词和各自出现的频率,然后给出m个某些单词的开头,要求找出频率最高不超过10个的以这些字符串开头的单词。
分析:
显然是字典树的题目,如果把单词建字典树,然后对于每个开头字符串,都查询一遍字典树,显然会超时。
所以逆向思考一下,把开头字符串建立字典树,然后查询每个单词,每个开头字符串找出不超过10个单词,这样就很容易实现了~~
#include <cstdio> #include <iostream> #include <vector> #include <algorithm> #include <cstring> #include <string> #include <map> #include <cmath> #include <queue> #include <set> using namespace std; typedef long long ll; typedef pair<int, int>pii; const double PI = acos (-1.0); const int INF = 0x3f3f3f3f; const int N = 3e5 + 9; int to , cnt ; char ans [11][16], s[16]; struct Item { char arr[16]; int num; bool operator < (const Item& rhs) const { if (num == rhs.num) return strcmp (arr, rhs.arr) < 0 ? 1 : 0; return num > rhs.num; } } p ; const int maxnode = 3e5 + 10; struct Trie { int ch[maxnode][26]; int val[maxnode]; int sz; void clear() { sz = 1; memset (val, 0, sizeof (val) ); memset (ch[0], 0, sizeof (ch[0]) ); } int idx (char c) { return c - 'a'; } void insert (const char *s, int id) { int u = 0, n = strlen (s); for (int i = 0; i < n; i++) { int c = idx (s[i]); if (!ch[u][c]) { memset (ch[sz], 0, sizeof (ch[sz]) ); ch[u][c] = sz++; } u = ch[u][c]; } if (!val[u]) val[u] = id, to[id] = id; else to[id] = val[u]; } void search (const char *s) { int u = 0, len = strlen (s); for (int i = 0; i < len; i++) { int c = idx (s[i]); u = ch[u][c]; if (u) { if (val[u] && cnt[val[u]] <= 9) strcpy (ans[val[u]][cnt[val[u]]++], s); } else break; } } }; Trie trie; int main() { //freopen ("f.txt", "r", stdin); int n, m; trie.clear(); memset (cnt, 0, sizeof (cnt) ); scanf ("%d", &n); for (int i = 1; i <= n; i++) scanf ("%s%d", p[i].arr, &p[i].num); sort (p + 1, p + 1 + n); scanf ("%d", &m); for (int i = 1; i <= m; i++) { scanf ("%s", s); trie.insert (s, i); } for (int i = 1; i <= n; i++) { trie.search (p[i].arr); } bool flag = 0; for (int i = 1; i <= m; i++) { if (flag) printf ("\n"); flag = 1; for (int j = 0; j < cnt[to[i]]; j++) printf ("%s\n", ans[to[i]][j]); } return 0; }
相关文章推荐
- URAL 1542. Autocompletion 字典树
- URAL 1542. Autocompletion 字典树
- ural 1820. Ural Steaks -思维题
- URAL 1542. Autocompletion (线段树+STL)
- 2017多校第9场 HDU 6161 Big binary tree 思维,类似字典树
- URAL 1409 Bishops 思维问题
- HDU 3460 Ancient Printer(思维题或字典树)
- 【zzulioj】河南多校训练(985专场)<位运算--DP---思维--扩展欧几里德---回溯---字典树---状态优化>
- Ural 1542. Autocompletion(二分)
- URAL 2024 Adventure Time 思维题、Interesting
- URAL-1542 Autocompletion (字典序)
- 河南多校暑期训练-恢复赛 <字典树,最短路,queue,map,模拟,思维>
- G - Caterpillars URAL - 2064 ----思维题
- ural 2072 - Kirill the Gardener 3 详细题解 (思维+dp)
- Ural 2003: Simple Magic(数论&思维)
- 思维题+set URAL 1718 Rejudge
- Ural2004: Scientists from Spilkovo(德布鲁因序列&思维)
- C - Different Sums URAL - 2065 ----思维题
- hdu--2846--字典树<怪我思维不够跳跃>
- URAL 1409 Two Gangsters (开放思维)