CodeForces - 566A Matching Names(字典树)
来源:互联网 发布:淘宝证书怎么下载 编辑:程序博客网 时间:2024/06/05 15:08
题意:
有n个学生在学校,他们有n个真名,以及n个假名。
求如何真名和假名,匹配使得LCP和最大。
解析:
先给真名和假名标号,然后插入到字典树上。
一颗字典树上面的每个节点,保存的是每个字符串前缀的编号。
然后对字典树进行dfs,然后优先选择深的匹配,并标记。
然后回溯匹配,被标记过的不要。
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#define pb push_back#define mp make_pairusing namespace std;typedef pair<int, int> pii;const int MAXN = 1e5 + 10;const int maxnode = 800005;const int sigma_size = 26;vector< pii > ans; struct Trie { int ch[maxnode][sigma_size]; vector<int> val[maxnode][2]; int sz; void clear() {sz = 1; memset(ch[0], 0, sizeof(ch[0]));} Trie() { clear(); } int idx(int c) { return c - 'a'; } void insert(char *s, int id, int v) { int u = 0, n = strlen(s); val[u][id].pb(v); for(int i = 0; i < n; i++) { int c = idx(s[i]); if(!ch[u][c]) { memset(ch[sz], 0, sizeof(ch[sz])); val[sz][id].clear(); ch[u][c] = sz++; } u = ch[u][c]; val[u][id].pb(v); } }} trie;bool vis[2][MAXN];int n, total;void init() { trie.clear(); ans.clear(); memset(vis, false, sizeof(vis));}void dfs(int u, int dep) { for(int i = 0; i < sigma_size; i++) { if(trie.ch[u][i]) { dfs(trie.ch[u][i], dep+1); } } vector<int>& name = trie.val[u][0]; vector<int>& pse = trie.val[u][1]; int a, b; for(int i = 0; i < name.size(); i++) { a = name[i]; if(vis[0][a]) continue; for(int j = 0; j < pse.size(); j++) { b = pse[j]; if(vis[1][b]) continue; vis[0][a] = vis[1][b] = true; ans.pb(mp(a, b)); total += dep; break; } }}char str[maxnode];int main() { while(scanf("%d", &n) != EOF) { init(); for(int i = 1; i <= n; i++) { scanf("%s", str); trie.insert(str, 0, i); } for(int i = 1; i <= n; i++) { scanf("%s", str); trie.insert(str, 1, i); } total = 0; dfs(0, 0); printf("%d\n", total); for(int i = 0; i < ans.size(); i++) { printf("%d %d\n", ans[i].first, ans[i].second); } } return 0;}
0 0
- CodeForces - 566A Matching Names(字典树)
- codeforces 566A Matching Names
- [贪心+Trie] Codeforces #566A. Matching Names
- CodeForces 566 A Matching Names(Trie 匹配LCP和最大)
- 多对多LCP和最大 Trie DFS CodeForces - 566A Matching Names
- CF512A:Fox And Names(拓扑排序 & 字典树)
- [CodeForces 510C]Fox And Names[字典序][拓扑排序]
- Matching Names(Trie树)-(VK Cup 2015 - Finals, online mirror)
- Codeforces Round #290 (Div. 1)A. Fox And Names
- Codeforces Round #290 (Div. 1) A. Fox And Names
- Codeforces 455B A Lot of Games(字典树+博弈)
- 【CodeForces】445B A Lot of Games 字典树博弈
- 【字典树+dp】 codeforces 455B A Lot of Games
- CodeForces 455B A Lot of Games 字典树 博弈
- Codeforces Problem 713A Sonya and Queries(字典树)
- CodeForces 713A|Sonya and Queries|字典树|没方法
- codeforces 706D(字典树)
- codeforces 706D(字典树)
- 九度oj 1122
- [BZOJ 1188]分裂游戏
- Ubuntu下两个gcc版本切换
- 设计原则开篇
- Android之——屏幕适配px转dip
- CodeForces - 566A Matching Names(字典树)
- 南邮 OJ 2080 KSS的金牌梦1
- MySQL增加,删除,更新,导出数据
- DispatcherServlet Processing Sequence
- 南邮 OJ 2082 Football
- 今天在使用tar进行打包时,发现报了‘从成员名中删除开头的“/”’的错误
- java自定义注解以及注解的简单介绍
- ios学习笔记:ios推送细节
- 二叉搜索树