字典树

HDU 5536 Chip Factory (01字典树)

浪尽此生 提交于 2020-04-03 08:19:13
题意:就是求max((si+sj)^sk) 思路:就是直接建01字典树,在上面求异或,对于枚举的ij,我们先在字典树中进行删除,然后在插入进去(调一下午也没调出来,不知道错哪里了) 代码: #include <bits/stdc++.h> using namespace std; const int maxn=1000+10; int n; int a[maxn]; int sz; int trie[100000+10][2]; int cnt[100000+10]; void init() { sz=1; memset(trie[0],0,sizeof(trie[0])); } void Insert(int v,int d) { int u=0; for(int i=30;i>=0;i--){ int c=(v>>i)&1; if(!trie[u][c]){ trie[sz][0]=trie[sz][1]=0; cnt[sz]=0; trie[u][c]=sz++; } u=trie[u][c]; cnt[u]+=d; } } int solve(int x) { int res=0,u=0; for(int i=30;i>=0;i--){ int c=(x>>i)&1; if(trie[u][c^1] && cnt[trie[u][c^1]]){ res|=(1<<i); u

UPC-9264 Chip Factory(01字典树)

孤人 提交于 2020-04-02 14:15:57
题目描述 John is a manager of a CPU chip factory, the factory produces lots of chips everyday. To manage large amounts of products, every processor has a serial number. More specifically, the factory produces n chips today, the i-th chip produced this day has a serial number si. At the end of the day, he packages all the chips produced this day, and send it to wholesalers. More specially, he writes a checksum number on the package, this checksum is defined as below: which i, j, k are three different integers between 1 and n. And is symbol of bitwise XOR. Can you help John calculate the checksum

【01字典树】hdu-5536 Chip Factory

老子叫甜甜 提交于 2020-04-02 14:15:48
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5536 【题意】 求一个式子,给出一组数,其中拿出ai,aj,ak三个数,使得Max{ (ai+aj) ^ ak } 【题解】 其实这里就需要大家做一个删除的操作; 类似于dfs的恢复现场的操作即可。 【代码】 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N = 1e5+10; 6 int Son[N*31][2]; 7 int a[N],idx; 8 int Cnt[N*31]; 9 void Insert( int x ){ 10 int p = 0 ; 11 for(int i=30;~i;i--){ 12 int t = x >> i & 1 ; 13 if( !Son[p][t] ){ 14 Son[p][t] = ++idx; 15 } 16 p = Son[p][t]; 17 Cnt[p] ++ ; 18 } 19 } 20 void Delete( int x ){ 21 int p = 0 , tmp ; 22 for(int i=30;~i;i--){ 23 int t = x >> i & 1 ; 24 if(

字典树及相关问题

不问归期 提交于 2020-03-25 22:33:06
字典树模板题 LeetCode 208. 实现Trie(前缀树) class Trie { public: /** Initialize your data structure here. */ Trie() { isEnd = false; fill(begin(next), end(next), nullptr); } /** Inserts a word into the trie. */ void insert(string word) { Trie* curr = this; for(auto ch : word){ if(curr->next[ch-'a'] == nullptr){ curr->next[ch-'a'] = new Trie(); } curr = curr->next[ch-'a']; } curr->isEnd = true; } /** Returns if the word is in the trie. */ bool search(string word) { Trie* curr = this; for(auto ch : word){ if(curr->next[ch-'a'] == nullptr){ return false; } curr = curr->next[ch-'a']; } return curr->isEnd; }

P1666前缀单词

一个人想着一个人 提交于 2020-03-25 14:58:49
题目传送门 点我传送 Ⅰ.字典树+树型DP 非常奇妙的一种解法 第一部分:构建树 先对来的单词读入,插入字典树 然后对于一颗字典树,其实是有很多无用边的,所以我们需要删去一些边 删去 非单词节点和非单词节点之间的边 ,其实就是下面这个函数 void rebuild(int now,int fa) { if(isok[now])//当前节点是单词 { vec[fa].push_back(now);//连边 fa=now;//换爸爸了 } for(int i=1;i<=26;i++) { if(!tree[now][i]) continue; rebuild(tree[now][i],fa);//递归 } } 第二部分:树型DP 对于每一棵子树而言,右选和不选两种方案 选,则子树上的节点都不能再选,即为 \(dp[i][1]=1\) 不选,则子树上的节点可选可不选 \(f[i][0] = \prod_{j\in son[i]}(f[j][0]+f[j][1])\) 因为是计算方案,决策之间是彼此联系的,所以是相乘 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=5009; int n; int tree[maxn][27];int isok[maxn],tot;

字典树(前缀树/后缀树)

你离开我真会死。 提交于 2020-03-22 18:15:14
用途 有人说是为了统计字频,可我觉得 HashMap 就可以完成。有人说比 HashMap 占用内存要小,但我感觉小也小不到哪里去。 有人说为了查询字符,还是那句话,HashSet 表示我也可以。 也许在 Hash 没有出来前,它也许在这些领域占有一席之地。目前,从数据结构来看,我认为它的作用也许在以下方面比较突出: 也被称为 前缀树,就是剔除相同的前缀操作,这里看不懂很正常,后面慢慢说 搜索提示,讲了下面结构你就理解了 结构 这就是字典树,我们沿着最左边走一遭,那就是 JOHNNY。 先来说下之前提到的第一个用途,前缀树。比如有两个字符串, JOHNNY 和 JOHN。可以发现两者拥有前缀,JOHN,这有什么作用呢?数据压缩的时候也许会用到,可以看这题。 820. 单词的压缩编码 接下来,说说第二个功能。比如你在搜索框中输入了 JO,那我根据字典树,我猜测你要找的也许是 JOHNNY 或者 JOE,然后我会给你提示。 定义数据结构 讲一个数据结构,主要就讲,如何去定义一个数据结构,然后涉及相关的操作,这里就是添加(搭建)、删除操作。 因为这也是一个树的结构,只不过这里不一定是二叉树,上面的图有点误导,我们如果要表示英文字符的话,那么从根节点出发,应该有26个字符可供选择。 class NodeTree{ // 用数组编号代替字符,会减小搜索查询时间复杂度 NodeTree[]

HDU-5269 ZYB loves Xor I

倾然丶 夕夏残阳落幕 提交于 2020-03-08 13:25:55
题目大意: 给出一个长度为n的数组A,让你求出lowbit(A[i]^A[j])的和对998244353取模的结果,其中i和j都属于[1,n]。lowbit(x)表示的是满足x xor 2^k > 0最小的2^k 解题思路: 因为数据规模很明显是5e4这样的规模,直接暴力搞必然超时,那么我们可以考虑一个问题,对于异或,如果x xor 2^k > 0的话,k一定是x二进制表示中最小的一位为1的数。 知道了这个还是无法求出来这个问题。因为涉及到异或问题,所以我们很容易想到字典树,字典树第h层的左子树表示数据自右向左第h位为0的,右子树表示第h位为1。 而这两个如果同时存在,那么这两个节点当前能表示的数的个数的乘积乘以1 << h就是这两个节点能表示的数的lowbit值。 最后答案乘以2即可。 代码: #include <cstring> #include <iostream> using namespace std; typedef struct node { int val; int nxt[2]; }Trie; const int maxn = 50005; const int mod = 998244353; int tot; Trie t[maxn * 30]; void Insert(int x) { int tmp, p = 0; for (int i = 0; i <

数据结构-字符串-字典树

僤鯓⒐⒋嵵緔 提交于 2020-03-08 09:45:29
数据结构-字符串-字典树 参考资料 暂无 字典树就是著名的 \(trie\) 树,是未来学很多字符串自动机的必备前置知识。 用处:插入字符串,查找字符串出现次数。 这个数据结构就是一个有根树,根节点编号为 \(1\) 。除了根节点外,每个节点上有一个字母。对于每个节点 \(x\) , \(ch[x][c]\) 表示这个节点的儿子中字符为 \(c\) 的那个的编号, \(mk[x]\) 表示插入的字符串中以这个节点为结尾的字符串数。 每当要插入一个字符串 \(s\) (下标从 \(1\) 开始)时,就从根节点 \(1\) 开始,如果根节点 \(1\) 没有字符为 \(s[1]\) 的子节点,就创造一个那个节点,然后无论那个节点是不是刚被创造出来的,走到那个节点。然后再看那个节点有没有字符为 \(s[2]\) 的子节点,然后如此操作,走到 \(s[n]\) (字符串长度为 \(n\) )时, \(mk[\) 单前节点 \(]++\) 。 查找字符串 \(s\) 时,也从根节点 \(1\) 开始,沿着 \(ch[][]\) 数组走,如果发现某次节点没有字符串 \(s\) 的单前字符子节点,那么久说明字符串 \(s\) 以前没有出现过。否则,走到 \(s[n]\) 时,可得 \(s\) 字符串出现的次数就为 \(mk[\) 单前节点 \(]\) 。 \(\texttt{For

Trie ——前缀树、字典树

☆樱花仙子☆ 提交于 2020-03-05 07:13:57
说在前面: Map 映射数据结构和 Trie 的异同: 相同 :都能够根据 key 进行映射得到对应的值。 不同 : ① Trie 中查询/添加的算法复杂度为 O(len) , 即插入/查询的字符串的长度 ,而 Map 查询/添加的算法复杂度为 O(logn) , n为输入的查询元素个数 。 ② Trie 是用多叉树实现的,而 Map 一般是用二叉树实现的。 Trie :专门为了处理(存储/查询)字符串而设计的 Trie 是以时间换空间的,提高了搜索效率但是却浪费了空间 改良数据结构:① 压缩字典树 ② 三分搜索树 Trie 压缩字典树 三分字典树 :牺牲了一定的时间,但是节省了空间 1. 应用场景: ① 子串查询 ② 文件压缩( 文件实际上是由很长的字符串组成的,故文件压缩是对很长的字符串进行压缩的 ) ③ 模式匹配(eg:正则表达式的引擎) ④ DNA(DNA本身就是一个超长的字符串) 2. 设计 Trie 由于 Trie 是一棵多叉树,则在其每个节点的设计中需要保存多个下一个结点的位置,故需要通过 Map ,即映射的数据结构进行存储下一堆结点的位置, 映射数据结构的每一个元素的 key 即为下一个结点对应的标识,而 value 则是下一个结点的位置 下面实现中 Trie 中保存的是一个个单词,故在设计 Trie 时需要给每个节点添加一个 isWord 标识

Immediate Decodability(字典树)

早过忘川 提交于 2020-03-05 00:19:13
Immediate Decodability Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2248 Accepted Submission(s): 1168 点我 Problem Description An encoding of a set of symbols is said to be immediately decodable if no code for one symbol is the prefix of a code for another symbol. We will assume for this problem that all codes are in binary, that no two codes within a set of codes are the same, that each code has at least one bit and no more than ten bits, and that each set has at least two codes and no more than eight. Examples: Assume an alphabet that