随笔分类 -  ACM / Trie

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