多对多LCP和最大 Trie DFS CodeForces - 566A Matching Names
来源:互联网 发布:sql 别名 后续能否使用 编辑:程序博客网 时间:2024/06/05 19:43
http://codeforces.com/problemset/problem/566/A
题意:
有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
- 多对多LCP和最大 Trie DFS CodeForces - 566A Matching Names
- CodeForces 566 A Matching Names(Trie 匹配LCP和最大)
- [贪心+Trie] Codeforces #566A. Matching Names
- codeforces 566A Matching Names
- CodeForces - 566A Matching Names(字典树)
- codeforces 455B A Lot of Games (Trie + dfs)
- codeforces-510C-Fox And Names【DFS】
- lcp计数 (Trie)
- 【字符串】【Trie】lcp 题解
- Codeforces #260 (Div. 1) B. A Lot of Games(数据结构:trie+DFS)
- Matching Names(Trie树)-(VK Cup 2015 - Finals, online mirror)
- codeforces367(字符串hash求lcp比较大小,Trie解最大异或问题)
- Codeforces 781A dfs
- codeforces 896A dfs
- Codeforces Round #367 (Div. 2)-Vasiliy's Multiset-最大异或和-trie
- 【多校训练】hdu 6073 Matching In Multiplication. 拓扑+dfs
- Codeforces Round #290 (Div. 1)A. Fox And Names
- Codeforces Round #290 (Div. 1) A. Fox And Names
- 1181:变形课
- hdu 5477__A Sweet Journey
- 经典图书清单
- iOS讲解迷惑深入浅出之复杂对象的归档
- 软件测试过程及其管理
- 多对多LCP和最大 Trie DFS CodeForces - 566A Matching Names
- IT职场求生法则-----我在IT职场打滚超过15年了,从小小的程序员做到常务副总
- openlayers2中selectcontrol用法
- 7. --SQLite 专属的整体查找
- Global File System
- 调试wow64进程
- 总结和目标,我的下半年学习计划。
- IOS JSON的四种解析方法(转)
- 理解Linux系统负荷