随笔分类 - ACM / Trie
摘要:原题链接 考察:Trie+dfs 思路: 将每个数插入Trie中,可以发现如果子树的结点>=2,那么这些结点会内部连接,也就是说:如果左子树和右子树的结点都>=2,那么它们就是割裂的,我们需要删除一些点使得它们连接. 最少删除数 = 最大保留数.对于当前树u, 最大保留数 :f[u] =max(f[
阅读全文
摘要:原题链接 Trie+位运算+前缀和思想+后缀和思想 错误思路: 如果枚举两个端点,结果还是会TLE,就算先预处理每个sum[i]对应异或的最大值,排序,考虑到最坏情况结果时间复杂度还是会到10的10次方,因此此解不可行 正确思路: 本道题要求两个区间内的异或最大值,我们可以用一个数组ans[i]记录
阅读全文
摘要:原题链接 Trie+位运算 和前面差不多的题,但是注意一下i、j、k都是不同的,在找异或最大值的时候要把i、j从树上删除,枚举完后再加回来 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace
阅读全文
摘要:原题链接 Trie+位运算 和前面题一样标记下删除的路径即可 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int N = 200010; 6 int idx
阅读全文
摘要:原题链接 想在vj上做来着..结果vj半天登不上去... 错误思路: 暴力枚举TLE 错误思路2: 用cnt数组标记用了的数字,但注意如果我们只标记叶子结点,那么就会陷入死循环,因为每次都要走到底才能知道是否能用 正确思路: 用cnt数组标记当前结点的子节点的个数,因为可能存在重复数字,所以不能简单
阅读全文
摘要:原题链接 考察:Trie+位运算 错误思路1: 枚举端点异或,这样肯定TLE 错误思路2: 利用前缀和思想,区间[i,j]内异或 = sum[i-1]^sum[j],将所有sum值插入树中枚举一个点,另一个利用之前的sum xor的思想,但是这样是错的,我们要取sum的下标,但数据量大的时候存在相同
阅读全文
摘要:原题链接 Trie+位运算 错误思路: 枚举数组里每一个数与询问的数异或,利用桶排序求最小值.时间复杂度O(n^2),TLE 正确思路: 想AC本题首先要明确几个性质: x^y^z = x^(y^z) 0~n位二进制数与n位二进制数异或的结果仍然在0~n位二进制数内,且不存在不同数取相同值的结果 3
阅读全文
摘要:原题链接 Trie的基本运用 错误思路: 将要查找前缀的字符串构建字典树,这样的结果是每个字符串都要重新构建一次树,并且我们需要预先保存要匹配前缀的单词,但题目单词数目没有讲明,所以我们必须将建树的字符串互换.(这样建树会导致MLE) 正解思路: 将前缀建树,如果达到一个结点有单词就+1,如果没有单
阅读全文
摘要:原题链接 字典树模板题 错误思路: 很容易看出枚举两个数字必定TLE,但这题求最值必须枚举一个数,因此我们可以在枚举第二个数进行优化 正确思路: 在枚举第二个数时,将第一个数的每一位分开贪心求解,将范围内的数全部插入字典数中,查询是否能获得高位尽量与第一个数相反的数 1 #include <iost
阅读全文