Ⅰ-丑话说在前头
看到讨论区这么多篇学术我觉得ACGO出息了,心血来潮写点简单的数据结构玩玩。
我真的是**写错了或者写的不好补药骂我
Ⅱ-词汇量不足,我要查字典
字典树(Trie tree)是一种数据结构吗?我也不知道,我爱封装我爱封装我爱封装我爱封装。
字典?先查首字母呗,首字母放在树的根呗,那还说啥了一个一个字查呗。
那这个图是不是存储了acgo、acm、apple。但是如果字母是点的话岂不是有好多个根,真麻烦,那还说啥了字母存边上呗。
别以为有图,我懒的画。
Ⅲ-这啥啊不是,怎么实现呢
插入一个单词的过程:
单词:啊啊啊我出现了:
1.这个字母之前有过,我走这里吧
2.居然没有这个字母,我创建一个新的边吧
我插入完成啦!我在节点 kkk 结束,那么 endk++end_k++endk ++ 吧!
查找一个单词的过程:
单词:我来找找这颗树之前有没有我:
1.这个字母之前没有过吗?那就是没有我咯(失落)
2.这个字母之前有过,我们接着走看看后面还有没有
3.结束啦,所有字母都有,看看有没有单词在我这里结尾?
3-1. 有!我在这颗树上
3-2. 没有!操,居然这个树上没有我
查找树中有多少个单词是该单词的前缀的过程:
单词:哈罗哈罗我出现了!
1.这个字母之前没有过了,那就是后面不会有了
2.这个字母之前有,接着走
2-1. 之前有单词在这里结尾欸?!那它就是我的前缀
2-2. 没有算了...
Ⅲ-我爱封装
Ⅳ-其实我不想做题
可恶的异或
这对吗,我学过这个吗?
01Trie树吗有点意思,异或相同为1不同为0,你就反着走呗那还说啥了。窝巢这也太简单了。
我爱封装
Ⅴ-还有高手
自己想的一道题。
怎么如此之大。
好的怎么做?
Ⅴ-Ⅰ FIRST THINKING
看到数据范围,5×1045 \times 10^45×104,大概要 O(n)O(n)O(n) 或者 O(nlogn)O(n log n)O(nlogn) 或是一些常数通过了。首先,这道题的题面很容易让人联想到 The XOR Largest Pair。我们当时怎么求得异或值最大呢?当然是**“反着选”**。那么我们要求两个数的异或值,又该如何求呢?
Ⅴ-Ⅱ SECOND THINKING
还记得数位DP吗?我们通过 limit 求得一个数是否小于另一个数的方法还记得吗?我们能否结合一下,试着把 limit 搬入这道题中判断位数?
Ⅴ-Ⅲ THIRD THINKING
一个数的十进制是几位数,我们可以通过判断和一个数的大小来决定吗?例如:如果一个数 >=100>= 100>=100,那么是否说明它一定是 >=3>= 3>=3 位数呢?换成二进制,如果一个数的二进制 ≥1100100(1002)\ge 1100100(100_2)≥1100100(1002 ) ,是否也说明它的十进制位数一定是 ≥3≥3≥3 的呢?
Ⅴ-Ⅳ FOURTH THINKING
我们依次判断一个数的二进制 >=1(12)>= 1(1_2)>=1(12 ),≥1010(102)\ge 1010(10_2)≥1010(102 ), >=1100100(1002)>= 1100100(100_2)>=1100100(1002 ),每次如果成立就 +1+1+1,最后得到的是不是就是该数转化为十进制的位数?所以,limit=(10k)2limit=(10^k)_2limit=(10k)2 。
Ⅴ-Ⅴ FIFTH THINKING
分类讨论,如果 (limit>>i)&1(limit>>i)\&1(limit>>i)&1 得到 111,该位如果要 ≥limit≥limit≥limit,该位只能为 111。(理解不了来找我)。相应的如果 (limit>>i)&1(limit>>i)\&1(limit>>i)&1 得到 000,该位可以为任何数(0,10,10,1)。
好了你会了。
Ⅵ-这题怎么是紫色的
我咋知道。
终于不是01Trie了吗
只要排序够好,情况1不会出现。你会证明吗反正我不会证明,骗你的我会证明但是我不会证明。
DFS序是对的因为你看题解的证明说它是对的。
另外你怎么知道我学校模拟赛场切了这道紫。
合着代码是凑字数的呗。
Ⅶ-我不行了
是Ⅶ了吗已经,我写这个傻福东西居然写了这么久,我不行了我不行了我不行了我不行了我不行了我不行了我不行了。
还有ACGO为什么用不了洛谷图床