poj 2001 Shortest Prefixes trie入门
题意:输入不超过1000个字符串,每个字符串为小写字母,长度不超过20;之后输出每个字符串可以简写的最短前缀串;
Sample Input
- carbohydrate
- cart
- carburetor
- caramel
- caribou
- carbonic
- cartilage
- carbon
- carriage
- carton
- car
- carbonate
Sample Output
- carbohydrate carboh (carbo不止一个字符串含有,所以不能作为简写符号)
- cart cart
- carburetor carbu
- caramel cara
- caribou cari
- carbonic carboni
- cartilage carti
- carbon carbon
- carriage carr
- carton carto
- car car
- carbonate carbona
- 对于trie的理解主要是对空间复杂度的理解;这道题直接使用了26叉trie树,maxnode并不是字符串的个数,而是字符串个数乘以长度,每一个节点还含有26个子节点。其实存储的很稀疏;
在insert中,从根节点开始顺序查找是否有第i个字符的子节点,没有直接重新开一个行向量(++sz),这就导致了最坏的时间复杂度为maxn * maxl * 26;只是方便查找;查找时直接在线输出即可;
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<string.h>
- #include<algorithm>
- #include<vector>
- #include<cmath>
- #include<stdlib.h>
- #include<time.h>
- #include<stack>
- #include<set>
- #include<map>
- #include<queue>
- using namespace std;
- #define rep0(i,l,r) for(int i = (l);i < (r);i++)
- #define rep1(i,l,r) for(int i = (l);i <= (r);i++)
- #define rep_0(i,r,l) for(int i = (r);i > (l);i--)
- #define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
- #define MS0(a) memset(a,0,sizeof(a))
- #define MS1(a) memset(a,-1,sizeof(a))
- #define MSi(a) memset(a,0x3f,sizeof(a))
- #define inf 0x3f3f3f3f
- #define lson l, m, rt << 1
- #define rson m+1, r, rt << 1|1
- typedef pair<int,int> PII;
- #define A first
- #define B second
- #define MK make_pair
- typedef __int64 ll;
- template<typename T>
- void read1(T &m)
- {
- T x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
- m = x*f;
- }
- template<typename T>
- void read2(T &a,T &b){read1(a);read1(b);}
- template<typename T>
- void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
- template<typename T>
- void out(T a)
- {
- if(a>) out(a/);
- putchar(a%+'');
- }
- const int maxl = * + ;
- struct Trie{
- int ch[maxl][];
- int val[maxl];
- int sz;
- Trie(){sz = ;MS0(ch);MS0(val);}
- void Insert(char *s){
- int u = , n = strlen(s);
- for(int i = ;i < n;i++){
- int c = s[i] - 'a';
- if(!ch[u][c]){
- //MS0(ch[u]); //* 开始建trie时,初始化了,这里不能删除加入的信息
- ch[u][c] = sz++;
- }
- u = ch[u][c];
- val[u]++;
- }
- }
- int Find(char *s){
- int u = , n = strlen(s);
- for(int i = ;i < n;i++){
- int c = s[i] - 'a';
- putchar(s[i]);
- u = ch[u][c];
- if(val[u] == ) break;
- }
- }
- }trie;
- char s[][];
- int main()
- {
- int n = ;
- while(scanf("%s",s[n]) == ){
- trie.Insert(s[n++]);
- }
- rep0(i,,n){
- printf("%s ",s[i]);
- trie.Find(s[i]);
- puts("");
- }
- return ;
- }
poj 2001 Shortest Prefixes trie入门的更多相关文章
- POJ 2001 Shortest Prefixes (Trie)
题目链接:POJ 2001 Description A prefix of a string is a substring starting at the beginning of the given ...
- POJ 2001 Shortest Prefixes 【 trie树(别名字典树)】
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15574 Accepted: 671 ...
- poj 2001 Shortest Prefixes(字典树trie 动态分配内存)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15610 Accepted: 673 ...
- OpenJudge/Poj 2001 Shortest Prefixes
1.链接地址: http://bailian.openjudge.cn/practice/2001 http://poj.org/problem?id=2001 2.题目: Shortest Pref ...
- poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12731 Accepted: 544 ...
- POJ 2001 Shortest Prefixes(字典树)
题目地址:POJ 2001 考察的字典树,利用的是建树时将每个点仅仅要走过就累加.最后从根节点開始遍历,当遍历到仅仅有1次走过的时候,就说明这个地方是最短的独立前缀.然后记录下长度,输出就可以. 代码 ...
- POJ 2001 Shortest Prefixes(字典树活用)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21651 Accepted: 927 ...
- POJ 2001 Shortest Prefixes 【Trie树】
<题目链接> 题目大意: 找出能唯一标示一个字符串的最短前缀,如果找不出,就输出该字符串. 解题分析: Trie树的简单应用,对于每个单词的插入,都在相应字符对应的节点 num 值+1 , ...
- poj 2001 Shortest Prefixes(特里)
主题链接:http://poj.org/problem?id=2001 Description A prefix of a string is a substring starting at the ...
随机推荐
- [006]为什么C++会被叫做是C++?
先了解一下自增和自减的运算符: 自增(++)和自减(--)操作符为对象提供加1或减1操作: int i = 0, j; j = ++i; // j = 1, i = 1: prefix yields ...
- 进程环境之C程序的存储空间布局
从历史上讲,C程序一直由下面几部分组成: 正文段.这是由CPU执行的机器指令部分.通常,正文段是可共享的,所以即使是频繁执行的程序(如文本编辑器.C编译器和shell等)在存储器中也只需有一个副本,另 ...
- 大设计时代:针对超大网页布局的一些思考和建议 [Aseoe]
对于有些设计项目来说,老套的设计模式并不奏效,你需要设计的大点,要比以往设计的元素还要大,因此就非常适合采用超大网页布局.无论是采用大块大块的背景照片还是背景视频,超大网页布局的效果非常显著:极具视觉 ...
- ExtJs 继承 和 插件 示例
Ext.ns('Ext.ux'); function btn(){ alert(this.id); }; var panel_plugs = {//定义插件 init : function(panel ...
- compile ffmpeg
download SDL 1.2.xxx version source code. 1) configure 2) make & make instll download recent ffm ...
- Android 自学之基本界面组件(上)
文本款(TextView)和编辑框(EditText)的功能和用法 TextView直接继承了View,他还是EditText.Button两个UI组件的父类,TextView的作用就是在界面上显示文 ...
- 关于gnome
关于GNOME GNOME(发音为英语发音:/ɡəˈnoʊm/[4]),即GNU网络对象模型环境(英语:The GNU Network Object Model Environment),GNU计划的 ...
- Python(2.7.6) 特殊方法
在 Python 中有种特殊方法,也称为魔法方法.特殊方法的方法名的前后各有两个下划线,如__init__,这种拼写表示名字有特殊的意义.如果类实现了这些方法中的某一个,那么这个方法会在特殊的情况下被 ...
- java多线程总结五:线程池的原理及实现
1.线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创 ...
- linux查看文件个数命令
linux下查看当前目录下文件个数命令: 使用背景:有时想了解一个目录下具体有多少文件或者有多少文件夹. 1. 查看当前目录下文件个数 ls -l |grep "^-"|wc -l ...