Trie树 模板
普通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树 模板的更多相关文章
- HDU 1251 Trie树模板题
1.HDU 1251 统计难题 Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #incl ...
- Phone list(Trie树模板)
Phone List 共t组数据,给定n个长度不超过10的字符串,问其中是否存在两个数S,T,使得S是T的前缀. 存在则输出NO,不存在输出YES 输入样例#1: 2 3 911 97625999 9 ...
- poj3630 Phone List (trie树模板题)
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26328 Accepted: 7938 Descr ...
- HDU 1251 统计难题 (Trie树模板题)
题目链接:点击打开链接 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单 ...
- Trie树模板1字符串统计
Trie树模板1字符串统计 我们首先来了解一下字典树,首先看一下一张字典树的图片 字典树就是一个可以高效存储.查找字符串的树,比如上面这个字典树就是存储abc,acb,bac的字典树. 1.插入操作( ...
- hiho #1014 : Trie树(模板)
Trie树 [题目链接]Trie树 &题意: 输入 输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英 ...
- LightOJ 1129 - Consistency Checker Trie树模板
题意:给出n条串判断是否存在一个串为另一个串的前缀. 思路:套Trie树的模板,先全部插入,再查找每个字串,如果查找字串完毕,但还存在下一个节点,说明存在前缀. /** @Date : 2016-11 ...
- Trie树模板2
Trie数模板2 problem 这道题然后我们求最大异或对,我们很容易想出来 \(O(n^2)\) 的做法,两层循环遍历搞定 然后我们知道这样是肯定是肯定过不了的,我们考虑用字典树解决,然后我们来看 ...
- trie树模板(统计难题)
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- Trie树模板~~~
* + ; ; // 字母表为全体小写字母的Trie struct Trie { int ch[maxnode][sigma_size]; int val[maxnode]; int sz; // 结 ...
随机推荐
- C++如何判断某一文件是否存在
函数名: access 功 能: 确定文件的访问权限 用 法: int access(const char *filename, int amode); 程序例: #include <stdio ...
- Markdown转义字符表
- js单线程
由于js是运行在单线程上的,所有浏览器单独开启一个线程来处理事件消息的轮询,避免阻塞js的执行.
- Http学习(二)
使用首部字段是为了给浏览器和服务器提供报文主体大小.所使用语言.认证信息等 4种首部字段类型 通用首部字段 请求首部字段 响应首部字段 实体首部字段 详细说明: HTTP首部字段类型 通用首部字段: ...
- selenium python bindings 初步用法及简单参考例子
掌握selenium最简单的方法就是参考例子进行学习,下面给出之前项目的测试例子及分析 # -*- coding: utf-8 -*- import time from selenium import ...
- VS2010-MFC(MFC常用类:CTime类和CTimeSpan类)
转自:http://www.jizhuomi.com/software/230.html 上一节讲了MFC常用类CString类的用法,本节继续讲另外两个MFC常用类-日期和时间类CTime类和CTi ...
- 基于token的验证
认证.权限和限制 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制.然后 权限 和 限制 组件决定是否拒绝这个请求. 简单来说就是: 认证确定了你是谁 权限确定你能不 ...
- springboot整合TinyMCE文件上传回显
今天想尝试TinyMCE富文本,准备着手搭建自己的博客,发现springboot上传文件,如果把文件放在static文件夹不能即时回显,百度了下,说是要刷新文件夹才能解决. 有问题就有解决办法 方法1 ...
- js 获取指定字符串个数
参考:https://blog.csdn.net/maqinqin/article/details/5323824 function getStrCount(scrstr,armstr) { //sc ...
- nput="file" 浏览时只显示指定excel文件,筛选特定文件类型
<p>显示 .xls, .xlsx, .csv 文件...</p><input type="file" accept=".csv, appl ...