Trie模板
来源:互联网 发布:看电视去广告软件 编辑:程序博客网 时间:2024/06/01 08:10
简单trie:
http://hihocoder.com/problemset/problem/1014
// http://hihocoder.com/problemset/problem/1014#include<bits/stdc++.h>#define pb push_back #define mp make_pairusing namespace std;const int maxn=1e5+7;typedef long long ll;struct trie{ const static int maxnode=1e6+7; const static int sigma_size=26; int ch[maxnode][sigma_size]; int val[maxnode]; int sz; void init() { sz=1; memset(ch[0],0,sizeof(ch[0])); } int id(char c) { return c-'a'; } void insert(char *s) { int i,j,len=strlen(s); int u=0; for(i=0;i<len;++i) { int c=id(s[i]); if(!ch[u][c]) { memset(ch[sz],0,sizeof(ch[sz])); val[sz]=0; ch[u][c]=sz++; } u=ch[u][c]; val[u]++; } } int find(char *s) { int i,j,len=strlen(s); int u=0; for(i=0;i<len;++i) { int c=id(s[i]); if(!ch[u][c]) return 0; u=ch[u][c]; } return val[u]; }}trie;int n,m,ans;char s[maxn];void doit(){ int i,j,k; trie.init(); cin>>n; for(i=1;i<=n;++i) { scanf("%s",s); trie.insert(s); } cin>>m; for(i=0;i<m;++i) { scanf("%s",s); printf("%d\n",trie.find(s)); } return;}int main(){ int i,j,k,T; doit(); return 0;}
一些细节:
1.init函数要注意ch数组只清ch【0】,之后每建一个节点,清一个节点的子节点和节点信息(val)
2.注意sz的初始化和改变(sz++)
—–
01trie:
http://acm.uestc.edu.cn/#/problem/show/1582
// http://acm.uestc.edu.cn/#/problem/show/1582#include<bits/stdc++.h>#define pb push_back #define mp make_pairusing namespace std;const int maxn=1;typedef long long ll;struct Trie{ const static int Maxn=4e6+7; int ch[Maxn][2],sz,val[Maxn]; void init() { sz=1; memset(ch[0],0,sizeof(ch[0])); } void insert(int now) { int u=0; for(int i=30;i>=0;--i) { int c=(now>>i)&1; if(!ch[u][c]) { memset(ch[sz],0,sizeof(ch[sz])); val[sz]=0; ch[u][c]=sz++; } u=ch[u][c]; } val[u]=now; } int search(int now) { int u=0; for(int i=30;i>=0;--i) { int c=(now>>i)&1; if(ch[u][c^1]) { u=ch[u][c^1]; } else { u=ch[u][c]; } } return now^val[u]; }}trie;int n,m;/* string trans(int now){ string a=""; for(int i=0;i<31;++i) { char c=now%2+'0'; a=c+a; now/=2; } return a;}*/ int main(){ int i,j,k,T; trie.init(); scanf("%d",&n); for(i=1;i<=n;++i) { scanf("%d",&j); trie.insert(j); } scanf("%d",&m); for(i=1;i<=m;++i) { scanf("%d",&j); printf("%d\n",trie.search(j)); } return 0;}
一些细节:
1.普通trie的注意
2.用位运算而不用字符串,效率提高约5倍
——–
阅读全文
0 0
- Trie模板
- Trie 模板
- Trie模板
- trie模板
- Trie模板
- Trie模板
- Trie模板
- Trie模板
- 【模板】Trie树模板
- trie树的模板
- trie树入门(模板)
- trie树模板
- 字典树(trie)模板
- Trie字典树【模板
- Trie树模板
- Trie树模板
- Trie树模板
- 字典树Trie 模板
- 平衡二叉树
- 关于mysql整除和取余
- c++中的继承
- C++和双重检查锁定模式(DCLP)的风险
- softmax的loss和gradient推导过程
- Trie模板
- 查看自己电脑的主板支持多大的内存
- 分布式锁
- CSS2 TABLE
- Amazon API Gateway
- 将eclipse新建项目的默认编码GBK改为UTF-8
- 使用Mobiscroll插件 输入框初始化默认出错问题
- BZOJ 1085 骑士精神 (A*)
- 适配器模式(类适配器)