字符串--Trie树(字典树)
2017-08-11 01:02
274 查看
关于这个字符串的数据结构我就不多说什么了,不知道的可以戳这里.
Trie树在OI中应用广泛,时间优秀,缺点就是空间占用大。
(下文中我们将字符集大小称为k,模式串长度为p)
Trie支持O(np)建树,O(p)插入,查询,删除。
可是如果二维数组存储的话,就要耗费kn的空间,基本无法承受。
空间上我们可以用指针动态分配内存来优化,减少内存的浪费。
Trie树还有一点好处,就是极易编写,极易调试,写暴力很好用。
不过,一般还是不用Trie树的。
上一道模板题:
code:
Trie树在OI中应用广泛,时间优秀,缺点就是空间占用大。
(下文中我们将字符集大小称为k,模式串长度为p)
Trie支持O(np)建树,O(p)插入,查询,删除。
可是如果二维数组存储的话,就要耗费kn的空间,基本无法承受。
空间上我们可以用指针动态分配内存来优化,减少内存的浪费。
Trie树还有一点好处,就是极易编写,极易调试,写暴力很好用。
不过,一般还是不用Trie树的。
上一道模板题:
洛谷 P2580 于是他错误的点名开始了
这题水到爆,最慢的点100ms(笑),所以是模板题。code:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> #include<vector> #include<queue> #define ll long long using namespace std; int ch[500001][26]; int tot; int val[500001]; int cnt[500001]; void insert(char *P){ int n=strlen(P); int u=0; for(int i=0;i<n;i++){ int c=P[i]-'a'; if(!ch[u][c]){ ch[u][c]=++tot; } u=ch[u][c]; } val[u]=1; } int cmp(char *T){ int n=strlen(T); int u=0; for(int i=0;i<n;i++){ int c=T[i]-'a'; if(!ch[u][c]){ return 0; } u=ch[u][c]; } if(!val[u]){ return 0; } if(!cnt[u]){ cnt[u]=1; return 1; } else{ return 2; } } int n,m; int main(){ scanf("%d",&n); char s[101]; for(int i=1;i<=n;i++){ scanf("%s",s); insert(s); } scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%s",s); int num=cmp(s); if(num==0){ printf("WRONG\n"); } else if(num==1){ printf("OK\n"); } else{ printf("REPEAT\n"); } } return 0; }
相关文章推荐
- [转载]Trie树|字典树(字符串排序)
- Trie树|字典树(字符串排序)
- Trie树|字典树(字符串排序)
- Trie树|字典树(字符串排序)
- Trie树|字典树(字符串排序)
- Trie树|字典树(字符串排序)
- Trie树|字典树(字符串排序)
- Trie树_字典树(字符串排序)简介及实现
- 字典树-大量字符串前缀及出现次数是否存在统计(Trie树-java)算法实现
- Trie树|字典树(字符串排序)
- Hash树(散列树)和Trie树(字典树、前缀树)
- Trie树|字典树的简介及实现
- 字典树(Trie树)的实现及应用
- 前缀树 / 字典树 / Trie树
- 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
- 从Trie树(字典树)谈到后缀树
- 字典树(Trie树)实现与应用
- 字典树(Trie树)
- Trie树/字典树题目(2017今日头条笔试题:异或)
- Phone List 【字典树 字符串集中 一个字符串是否为另一个的字符串的前缀】