POJ 2001 Shortest Prefixes(字典树)
2015-08-16 11:21
399 查看
题目链接:http://poj.org/problem?id=2001
题意:找每个单词可以区分自己与其他单词的最短的前缀。
思路:裸的字典树。每个节点多存一下到该节点为前缀的有几颗子树。
代码:
题意:找每个单词可以区分自己与其他单词的最短的前缀。
思路:裸的字典树。每个节点多存一下到该节点为前缀的有几颗子树。
代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <string> #include <vector> #include <map> using namespace std; #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 #define ceil(x, y) (((x) + (y) - 1) / (y)) const int SIZE = 35; const int N = 2e5 + 10; const int INF = 0x7f7f7f7f; const int MAX_WORD = 25; struct Trie { int val[SIZE]; int c; }; int sz, n; Trie pn ; char str [MAX_WORD]; int newnode() { memset(pn[sz].val, 0, sizeof(pn[sz].val)); pn[sz].c = 0; return sz++; } void init() { n = sz = 0; newnode(); } void insert(char *s) { int u = 0; for (int i = 0; s[i]; i++) { int idx = s[i] - 'a'; if (!pn[u].val[idx]) pn[u].val[idx] = newnode(); u = pn[u].val[idx]; pn[u].c++; } } int findstr(char *s) { int u = 0; for (int i = 0; s[i]; i++) { int idx = s[i] - 'a'; if (pn[u].c == 1) return i - 1; if (!pn[u].val[idx]) return i; u = pn[u].val[idx]; } return strlen(s) - 1; } int main() { init(); while (scanf("%s", str ) != EOF) insert(str[n++]); for (int i = 0; i < n; i++) { printf("%s ", str[i]); int k = findstr(str[i]); for (int j = 0; j <= k; j++) printf("%c", str[i][j]); printf("\n"); } return 0; }
相关文章推荐
- UVA 10294 Arif in Dhaka (置换polya)
- Android之assets资源
- codeforces 570 c
- 我开发的第一个Android软件
- AC算法初探
- POJ1915 Knight Moves(宽搜经典题目)
- Android Resources
- 电脑显示U盘,但是读取不了
- hdu 5391 (数论)
- import static和import的区别
- hdu 5391 (数论)
- JavaScript命名空间的理解与实现
- 正则表达式匹配一段标签内容
- MySQL中授权(grant)和撤销授权(revoke)
- 程序的思考之一个可以检验你指针理解功力的程序
- 初学Java多线程:向线程传递数据的三种方法
- android开发步步为营之71:CoordinatorLayout+AppBarLayout+RecyclerView+ViewPager打造可上下左右滑动的App主框架
- 10.2-7 O(n)非递归逆转单向链表的n个元素。
- CloudStack管理VMware遇到的问题
- Spring与Quartz的整合实现定时任务调度(转)