ACM模板——字典树

简介: ACM模板——字典树

01字典树

/*
数组大小定义为:2e6+10,数组大小与 n,m 是无关的,只与 cid 的最大值相关,算出对应的最多位数,比如:此题目中 cid 最大值为 1000000,对应的二进制位数最多 20位,根据完全二叉树的结点公式,最多 2^21-1。因为这里是边作为 二进制位,结点作为 链接下一个结点的下标。又因为题目说了是 cid^pid 最大的数,所以根据异或相同则0,不同则1的性质可知,只要是高位二进制各异就是最大的数了,所以 query 函数先尽量找与自己不一样的二进制,实在找不到的话,再选择自己的二进制位。
*/
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int n,m,cnt;
int trie[21*maxn][2];
int val[21*maxn];
void init()
{
    cnt=0;
    mem(val,0); mem(trie,0);
}
void add(int cid)
{
    int rt=0,id;
    for(int i=19;i>=0;i--) // 从 19 开始是因为从最高位开始操作
    {
        id=(cid>>i)&1;
        if(!trie[rt][id]) trie[rt][id]=++cnt; // trie[rt][id] 不能等于 0,以免与初始化混淆
        rt=trie[rt][id];
    }
    val[rt]=cid;
}
int query(int pid)
{
    int rt=0,id;
    for(int i=19;i>=0;i--) // 同上
    {
        id=(pid>>i)&1;
        if(trie[rt][id^1]) rt=trie[rt][id^1];
        else rt=trie[rt][id];
    }
    return val[rt];
}
目录
相关文章
|
4月前
|
C++
C++刷题ACM输入数组
C++刷题ACM输入数组
23 0
|
9月前
洛谷—模板字典树 P8306
洛谷—模板字典树 P8306
46 0
|
存储 机器学习/深度学习 算法
acm拿国奖的第一关:数组和字符串
首先,集合里的元素类型不一定相同。 你可以将商品看作一个集合,也可以将整个商店看作一个集合,这个商店中有人或者其他物品也没有关系。
90 0
acm拿国奖的第一关:数组和字符串
|
自然语言处理 算法 Shell
ACM算法竞赛及OJ题面常用英文单词整理
ACM算法竞赛及OJ题面常用英文单词整理
450 0
ACM模版——并查集
ACM模版——并查集
82 0
|
算法
ACM模板——KMP算法
ACM模板——KMP算法
109 0
|
算法
ACM模版——Manacher(最长回文子串)算法
ACM模版——Manacher(最长回文子串)算法
130 0
|
搜索推荐
ACM模板——拓扑排序算法
ACM模板——拓扑排序算法
126 0
|
人工智能 算法
ACM模板——二分查找(完整版)
ACM模板——二分查找(完整版)
189 0