某Trie树的简单例题
2016-05-22 21:47
288 查看
初学Trie树!解决字符串前缀问题的法宝!
T1:poj2001:Shortest Prefixes
题意:给一堆字符串,问每个字符串最短的不与其他字符串前缀重复的前缀(好奇怪的表述QAQ
貌似“字符串前缀”之类的先考虑Trie树就好了。。。
思路:建Trie树,每路过一个点该点cnt++;最后查询时发现cnt==1的点则为目标,如果找到最后还不行,就直接输出。
代码:
T1:poj2001:Shortest Prefixes
题意:给一堆字符串,问每个字符串最短的不与其他字符串前缀重复的前缀(好奇怪的表述QAQ
貌似“字符串前缀”之类的先考虑Trie树就好了。。。
思路:建Trie树,每路过一个点该点cnt++;最后查询时发现cnt==1的点则为目标,如果找到最后还不行,就直接输出。
代码:
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<iostream> #define cls(x) memset(x,0,sizeof x) const int maxn = 1010; using namespace std; struct trie { int next[27]; int cnt; }node[maxn<<5]; char c[maxn][25]; int tot; void add(char* str) { int rt=0; for(int i=0;str[i]!='\0';i++) { int x=str[i]-'a'; if(node[rt].next[x]) rt=node[rt].next[x]; else { node[rt].next[x]=++tot; rt=tot; } node[rt].cnt++; } } void query(char *str) { int rt=0; char b[100];cls(b); for(int i=0;str[i]!='\0';i++) { int x=str[i]-'a'; if(node[rt].cnt==1) { printf("%s\n",b); return ; } rt=node[rt].next[x]; b[i]=str[i]; //Trie树节点是空的,边上是字符,这句话要放在最后而不是前面 } printf("%s\n",str); return ; } int main() { int amt=0; while(~scanf("%s",c[++amt])) add(c[amt]); amt--; // 不要问这是什么。。。EOF时amt也++了 for(int i=1;i<=amt;i++) { printf("%s ",c[i]); query(c[i]); } return 0; }
相关文章推荐
- C++:抽象基类和纯虚函数的理解
- Javascript基础知识盲点总结——继承
- 【bzoj2120】数颜色
- Java.Swing.button绑定快捷键的3种办法
- leetcode.239. Sliding Window Maximum
- BehaviorDesigner学习
- 哈理工OJ 2002 幂集(DP问题)
- HTML5 WebApp开发(一)新建项目
- 中位数和顺序统计
- BZOJ 1046 DP 逆求最长下降序列+枚举
- Netdata,Linux性能实时监测工具
- c语言知识框架
- JavaScript函数基础知识
- Java 多线程总结(一)
- 2016-5-22模拟测试
- springMVC(12)------表单标签的使用
- 数据库设计备份还原(一)
- Redis主备同步
- 插入算法——思想上移 行动下移
- error: `cout' was not declared in this scope