普通Trie:

struct TRIE{
int trie[MAXN][],tot,end[MAXN];
TRIE(){tot=;}
void insert(char *s){//s为要插入的字符串
int len=strlen(s);
int u=;//1为根节点
for(int i=;i<len;i++){
int c=s[i]-'a';//'a'有时需换成'A'或'0'
if(!trie[u][c])//没有共同前缀,建立一个新的
trie[u][c]=++tot;//tot为总点数
u=trie[u][c];//继续向下插入单词
}
end[u]=true;//标记是一个出现过的单词(图中涂红色)
}
//查找单词是否是词典中某单词的前缀
bool find1(char *s){//s为要查找的字符串
int len=strlen(s);
int u=;//1为根节点
for(int i=;i<len;i++){
int c=s[i]-'a';//'a'有时需换成'A'或'0'
if(!trie[u][c])//单词没有出现,直接返回false
return false;
u=trie[u][c];//继续向下查找单词
}
//如果扫描完了这个单词
return true;//是某个单词的前缀
}
//查找单词是否在词典中出现过
bool find2(char *s){//s为要查找的字符串
int len=strlen(s);
int u=;//1为根节点
for(int i=;i<len;i++){
int c=s[i]-'a';//'a'有时需换成'A'或'0'
if(!trie[u][c])//单词没有出现,直接返回false
return false;
u=trie[u][c];//继续向下查找单词
}
//如果扫描完了这个单词
return end[u];//如果出现过,返回true;如果没有出现过(是前缀),返回false
}
}Trie;

01Trie:

struct TRIE_01{
int trie[MAXN*32][2],tot,end[MAXN*32];
TRIE_01(){tot=1;}
void insert(int x){
int root=1;
for(int i=32;i>=0;i--){
int t=((x>>i)&1);
if(!trie[root][t]) trie[root][t]=++tot;
root=trie[root][t];
}
end[root]=x;
}
int query(int x){ //查询所有数中和 x异或结果最大的数
int root=1;
for(int i=32;i>=0;i--){
int v=(x>>i)&1;
//利用贪心策略,优先寻找和当前位不同的数
if(trie[root][v^1]) root=trie[root][v^1];
else root=trie[root][v];
}
return end[root]; //返回结果
}
}Trie_01;

它还可以有平衡树的作用:

题目就是普通平衡树

#include <cstdio>
#include <algorithm>
#include <cstring>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 100010 * 33
using namespace std;
int root=1,tot=1,sumv[maxn],n,opt,x,ch[maxn][2];
void ins(int val,int c){
val += (int)1e7;
for(int i=31,p=root,t;i>=0;--i){
t=(val>>i)&1;
if(!ch[p][t]) ch[p][t]=++tot;
p=ch[p][t]; sumv[p]+=c;
}
}
int rank(int val){
val += (int)1e7;
int res=0,p=root;
for(int i=31;i>=0;--i){
int t=(val>>i)&1;
if(t) res += sumv[ch[p][0]];
p=ch[p][t];
}
return res; struct TRIE_01{
int trie[MAXN*32][2],tot,end[MAXN*32];
TRIE_01(){tot=1;}
void insert(int x){
int root=1;
for(int i=32;i>=0;i--){
int t=((x>>i)&1);
if(!trie[root][t]) trie[root][t]=++tot;
root=trie[root][t];
}
end[root]=x;
}
int query(int x){ //查询所有数中和 x异或结果最大的数
int root=1;
for(int i=32;i>=0;i--){
int v=(x>>i)&1;
//利用贪心策略,优先寻找和当前位不同的数
if(trie[root][v^1]) root=trie[root][v^1];
else root=trie[root][v];
}
return end[root]; //返回结果
}
}Trie_01; }
int kth(int val){
int k=root,res=0;
for(int i=31;i>=0;--i){
if(val>sumv[ch[k][0]]) res|=(1<<i),val-=sumv[ch[k][0]],k=ch[k][1];
else k=ch[k][0];
}
res-=(1e7); return res;
}
int main(){
//setIO("input");
scanf("%d",&n);
while(n--){
scanf("%d%d",&opt,&x);
if(opt==1) ins(x,1);
else if(opt==2) ins(x,-1);
else if(opt==3) printf("%d\n",rank(x)+1);
else if(opt==4) printf("%d\n",kth(x));
else if(opt==5) printf("%d\n",kth(rank(x)));
else if(opt==6) printf("%d\n",kth(rank(x+1)+1));
}
return 0;
}

Trie树 模板的更多相关文章

  1. HDU 1251 Trie树模板题

    1.HDU 1251 统计难题  Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #incl ...

  2. Phone list(Trie树模板)

    Phone List 共t组数据,给定n个长度不超过10的字符串,问其中是否存在两个数S,T,使得S是T的前缀. 存在则输出NO,不存在输出YES 输入样例#1: 2 3 911 97625999 9 ...

  3. poj3630 Phone List (trie树模板题)

    Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26328   Accepted: 7938 Descr ...

  4. HDU 1251 统计难题 (Trie树模板题)

    题目链接:点击打开链接 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单 ...

  5. Trie树模板1字符串统计

    Trie树模板1字符串统计 我们首先来了解一下字典树,首先看一下一张字典树的图片 字典树就是一个可以高效存储.查找字符串的树,比如上面这个字典树就是存储abc,acb,bac的字典树. 1.插入操作( ...

  6. hiho #1014 : Trie树(模板)

    Trie树 [题目链接]Trie树 &题意: 输入 输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英 ...

  7. LightOJ 1129 - Consistency Checker Trie树模板

    题意:给出n条串判断是否存在一个串为另一个串的前缀. 思路:套Trie树的模板,先全部插入,再查找每个字串,如果查找字串完毕,但还存在下一个节点,说明存在前缀. /** @Date : 2016-11 ...

  8. Trie树模板2

    Trie数模板2 problem 这道题然后我们求最大异或对,我们很容易想出来 \(O(n^2)\) 的做法,两层循环遍历搞定 然后我们知道这样是肯定是肯定过不了的,我们考虑用字典树解决,然后我们来看 ...

  9. trie树模板(统计难题)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  10. Trie树模板~~~

    * + ; ; // 字母表为全体小写字母的Trie struct Trie { int ch[maxnode][sigma_size]; int val[maxnode]; int sz; // 结 ...

随机推荐

  1. PHP缓存技术的应用1

    // 自定义缓存类 class Cache_Filesystem { // 缓存写保存 function set ($key, $data, $ttl) { //打开文件为读/写模式 $h = fop ...

  2. 边双联通分量缩点+树的直径——cf1000E

    题意理解了就很好做 题意:给一张无向图,任意取两个点s,t,s->t的路径上必经边数量为k 求这样的s,t,使得k最大 #include<bits/stdc++.h> #define ...

  3. 大数据之hadoop集群安全模式

    集群安全模式1.概述(1)NameNode启动 NameNode启动时,首先将镜像文件(Fsimage)载入内存,并执行编辑日志(Edits)中的各项操作.-旦在内存中成功建立文件系统元数据的影像,则 ...

  4. JSONObject 序列化后,对象数据为引用地址

    最近在json序列化的时候,遇到了个坑,记录如下: public static void main(String[] args) { JSONObject json = new JSONObject( ...

  5. MFC打开/保存文件对话框:CFileDialog

    MFC打开/保存文件对话框:CFileDialog CFileDialog   文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下: CFileDialog::CFileDial ...

  6. HDU - 1560 DNA sequence

    给你最多8个长度不超过5的DNA系列,求一个包含所有系列的最短系列. 迭代加深的经典题.(虽然自己第一次写) 定一个长度搜下去,搜不出答案就加深大搜的限制,然后中间加一些玄学的减枝 //Twenty ...

  7. 使用gulp搭建less编译环境

    什么是less? 一种 动态 样式 语言. LESS 将 CSS 赋予了动态语言的特性,如 变量, 继承, 运算, 函数. LESS 既可以在 客户端 上运行 (支持IE 6+, Webkit, Fi ...

  8. 笔记-ubuntu19共享文件夹

    这篇文章记录ubuntu和windows共享文件夹的步骤,环境是ubuntu19,两种方法,一种是图形化界面,一种是命令行. 图形化界面 打开文件软件,找到需要分享的文件夹,点击右键-属性-本地网络共 ...

  9. grep 强大的文本搜索工具

    1.grep -r "History folder does't exist:" * :中间是要搜索的文本,* 表示全部显示出来

  10. 【JZOJ3318】Brunhilda的生日

    description 除去对铁质盔甲强烈的热爱,Brunhilda是一个正常的7岁女孩.近期,她正在策划一个完美的生日派对.她发明了如下的一个游戏:所有的孩子在一个数k被宣读之前不停地跑来跑去.当这 ...