Trie树 hdu3460 Ancient Printer
2015-08-09 20:45
288 查看
大概的意思就是模拟输入顺序,,然后最少要按多少次键
仔细分析一下题目就可以发现:
1.输出的次数就等于n
2.如果建一个Trie树,因为最后可以保留一个单词而没必要删除它,所以除了这个单词的节点只被输入了,其他的节点都被输入了一次,和删除了一次
所以就能得到答案 Trie树节点数*2-最长单词长度+n
仔细分析一下题目就可以发现:
1.输出的次数就等于n
2.如果建一个Trie树,因为最后可以保留一个单词而没必要删除它,所以除了这个单词的节点只被输入了,其他的节点都被输入了一次,和删除了一次
所以就能得到答案 Trie树节点数*2-最长单词长度+n
#include<map> #include<set> #include<cmath> #include<queue> #include<cstdio> #include<string> #include<vector> #include<cstring> #include<iostream> #include<algorithm> #include<functional> using namespace std; typedef long long LL; typedef pair<int, int> PII; const int MX = 5e5 + 5; const int TX = 5e5 + 5; const int INF = 0x3f3f3f3f; struct Node { int num; int Next[26]; Node() { memset(Next, 0, sizeof(Next)); } } node[TX]; int T_rear; int trie_node() { node[++T_rear] = Node(); return T_rear; } void trie_add(int root, char*S) { int L = strlen(S); int p = root; for(int i = 0; i < L; i++) { int id = S[i] - 'a'; if(!node[p].Next[id]) { node[p].Next[id] = trie_node(); } p = node[p].Next[id]; } node[p].num++; } int main() { int n; char S[100]; while(~scanf("%d", &n)) { T_rear = 0; int Max = 0; int root = trie_node(); for(int i = 1; i <= n; i++) { scanf("%s", S); Max = max(Max, (int)strlen(S)); trie_add(root, S); } printf("%d\n", n + (T_rear - 1) * 2 - Max); } return 0; }
相关文章推荐
- 给dubbo接口添加白名单——dubbo Filter的使用
- 为别人撑伞(深度好文)
- JS将一个十进制转换成二进制
- java使用dbcp操作数据库的用法
- hdu 2874 lca-tarjan离线算法(模板)
- HDU 3478
- 第一章 绪论
- 高并发处理方案
- “||”操作符小用
- 队列笔记
- IM-即时通讯技术概述
- HDU 2444
- Android四大组件之三:ContentProvider数据共享
- unbuntu下如何更新adobe flash插件
- IM-即时通讯技术概述
- 协议详解3——IP
- PyQt5初级教程--PyQt5中的拖放[10/13]
- HDU 5366
- 【C/C++学院】0726-cppIDE/一级指针/指针数组/函数指针/函数指针数组/二级指针
- Flatten Binary Tree to Linked List