trie
a10.
这个作者很懒,什么都没留下…
展开
-
poj 3764
这题还是比较厉害的。题目 首先这是一颗无根树,不会处理,看了书才知道,我们可以转化为有根树,然后根据树的特性和前缀和的性质,可以得到d[x]=d[fa] xor weight(x,d[fa])。由此我们可以dfs出所有点的d,对于任意两点的路径异或,就是d[x] xor d[y],这个是因为异或的性质得到的,用手画两条路径就明白了,就可以转化为序列中任意两个数异或最大值了。(树转序列好像也是一个方向) 当然这题有点卡空间,当list空间过不去,可以用链式前向星,我觉得trie的题都比较耗空间,要建树和图都用原创 2020-07-15 08:58:15 · 172 阅读 · 0 评论 -
CH 1602 求序列中两数最大异或
题目 书上的解释一开始没懂,看了代码才知道是怎么回事。 我们把每一个数都转换成长度为32的二进制串,每一个数插入之前都会去找与它自己异或最大的值,但是怎么找呢?根据异或的特性我们可以得知,每一位与自己不同可以令数最大,那么对于第i个数的每一位,都要去找与这位不同的数(根据树的特性,我们从高位到低位储存是最容易处理的,因为这样做确保最高位最大),能找到这一位为1,不能则为0。不懂看看代码就明白了 #include<cstdio> #include<algorithm> #include原创 2020-07-14 17:33:15 · 214 阅读 · 0 评论 -
luogu 3879
题目 这题还真的是建立n颗trie树,诀窍在于如何压缩空间。 考虑使用bitset,bitset是8位才一个字节,空间直接除8,开个bitset数组就可以当二维数组用了。 #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<iostream> #include<bitset> using namespace std; int n,原创 2020-07-14 16:16:40 · 76 阅读 · 0 评论 -
hdu 1251
题目 简单的trie树题,利用类似前缀和的思想,每经过一个点就+1,在哪个点停在来就返回那个点的值,就做完了。 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<string> #define int long long using namespace std; int trie[10005*55][28],n,m,color[10原创 2020-07-14 14:20:48 · 84 阅读 · 0 评论