2021杭电1 1006 xor sum

给定n个数和一个数k,求出最短的连续的一段数,使得它们的异或和大于等于k,如果没有则输出-1。
其中1<=n<=1e5,0<=k, ai<=2^30

之前还没有做过这个类型的题,队友给我说可以用trie来搞,存个前缀和,然后就不会了。沿着这个想法乱搞了一下,发现还可以做,写了出来发现还真能过样例,调了一下(init忘了调用)就过了。

大致思路是这样的:trie上有0,1两个分支,从左到右枚举n个数,求出前缀异或和,转二进制塞到trie里面,同时trie上的节点存的是编号,也就是当前是1到编号i的前缀异或和。

每一次的询问,将k和xor_sum[i]带进去,然后从高位到低位求出trie上存的前缀和与xor_sum[i]的异或和,当这个值已经大于k的时候,就可以直接返回当前节点所存的编号;如果这个值加上后面都是1还是小于k的时候,说明达不到k,可以直接返回0。

因为r是确定的,我们需要求出的是l最大,因此insert的时候编号应该是大的覆盖小的,又insert的编号是从1到n,所以每次直接覆盖就行了。在query求解的时候就找出可行的前缀和编号的最大值就可以了。

由于我是mx初值设为0,所以要特判一下,特判就是当前的xor_sum已经是大于k的时候,那么l = 1, r = i一定是符合条件的一组解。

const int N = 1e5 + 10;
int trie[N * 31][2], mx[N * 31], fa[N * 31], tot = 0;void init()
{trie[0][0] = trie[0][1] = 0;for (int i = 0; i <= tot; i ++){mx[i] = fa[i] = 0;}tot = 0;
}void insert(int x, int pos)
{int temp[31];for (int i = 30; i >= 1; i --){temp[i] = x & 1;x >>= 1;}int now = 0;for (int i = 1; i <= 30; i ++){int p = now;mx[now] = pos;if (trie[now][temp[i]])now = trie[now][temp[i]];else{trie[now][temp[i]] = ++ tot;trie[tot][0] = trie[tot][1] = 0;now = tot;}fa[now] = p;}mx[now] = pos;
}int query(int r, int k, int now, int sum, int bit)
{if (sum >= k)return mx[now];if (sum + (1 << (bit + 1)) <= k)return 0;int ans = 0;if (trie[now][0]){int temp = (r & (1 << bit));ans = max (ans, query(r, k, trie[now][0], sum + temp, bit - 1));}if (trie[now][1]){int temp = (r & (1 << bit) ^ (1 << bit));ans = max(ans, query(r, k, trie[now][1], sum + temp, bit - 1));}return ans;
}int main()
{//freopen("data.txt", "r", stdin);//freopen("out.txt", "w", stdout);int T = 1;T = read();while (T --){init();int n, k;n = read(); k = read();int ans = n + 1, l = -1, r = -1;int sum = 0;for (int i = 1; i <= n; i ++){int a = read();sum ^= a;if (sum >= k){if (ans > i){ans = i;l = 1;r = i;}}int d = query(sum, k, 0, 0, 29);if (d > 0 && ans > i - d){ans = i - d;l = d + 1;r = i;}insert(sum, i);}if (ans == n + 1)printf ("-1\n");elseprintf ("%d %d\n", l, r);}
}

2021中超1 1006 xor sum相关推荐

  1. 2021中超1 1010 zoto

    平面上有n个点,坐标分别为(i, f[i]),有m个询问,每一次询问求出在(xl, yl, xr, yr)的区间当中有多少个y坐标不同的点. 数据范围:1<=n, m<=1e5, 0< ...

  2. 【HDOJ6955】Xor sum(异或前缀和,01字典树)

    1006 Xor sum 题意: 给出一个长度为n的序列,求一个最短连续子序列满足异或和大于等于k.n<1e5. 思路: 参考CF665E,求序列a中有多少个异或和大于等于k的子序列,枚举所有的 ...

  3. 新氧《2021中国医美抗衰消费趋势报告》:医美抗衰市场规模超755亿元

    医美抗衰,来势汹汹. 据Frost&Sullivan数据显示,2015年-2019年非手术类医美项目的规模复合增速为24.59%,高于手术类医美项目的21.16%.在非手术类医美项目中,注射类 ...

  4. 2021萧山三中高考成绩查询,最全!萧山各大高中上线人数揭晓!萧中超800人,三中紧随其后……...

    原标题:最全!萧山各大高中上线人数揭晓!萧中超800人,三中紧随其后-- 随着2020浙江高考分数线公布,今年我区高考上一段线人数再创新高,达2336人. 目前,萧山各大高中也纷纷公布了喜报,让我们一 ...

  5. 中超赛程来100wan点in_不干了:中超球队改名“硬重启”,球迷组织绝望解散

    聚焦中超和CBA,独一无二球迷媒体 点击右上角关注,你不会后悔的... 2021赛季中超注定会与众不同,足协的新规将陆续实施,如果降薪还在外界意料之中的话,那么更改中性化名字的要求则让多数俱乐部较为头 ...

  6. HDU4825 Xor Sum —— Trie树

    题目链接:https://vjudge.net/problem/HDU-4825 Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

  7. HDU4825 Xor Sum 01字典树(Tire Tree)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  8. Maximum XOR Sum 系列问题

    给定 $n$ 个两两不同的正整数 $a_1, a_2, \dots, a_n$,$a_i < 2^k$ . Problem 1(经典问题) 求 $a_i \xor a_j$ 的最大值,$ 1\l ...

  9. HDU - 6955 Xor sum tire树 + 贪心

    传送门 文章目录 题意: 思路: 题意: 给你一个数列aaa,你需要找出来一个长度最小且左端点最靠前的区间,使其异或和≥k\ge k≥k. n≤1e5,0≤ai,k<230n\le1e5,0\l ...

最新文章

  1. Java 过一下基础
  2. iOS开发中怎么样使用激光推送
  3. 左右无缝轮播图的实现
  4. 购买流程图java_Java实现基于控制台的购书系统基本操作
  5. StarlingMVC Framework中文教程
  6. FlexyPool如何同时支持连接代理和装饰器
  7. PID控制器开发笔记之十:步进式PID控制器的实现
  8. android8 压力触控,压力感应触摸屏的原理说明
  9. 数据结构实验 3.抓住那头牛
  10. Shell中判断文件,目录是否存在
  11. 超级电容怎么才能把内阻做小_内置超级电容汽车熄火仍可工作,韩国AHL车载无线充内藏重器...
  12. python是什么类型的编程语言-Python是一种什么样的编程语言?解释?编译?汇编?机械?...
  13. Codeforces Round #419 Div. 1
  14. 爬虫笔记_1、爬虫的五个步骤及举例
  15. linux服务器一键可视化,安装宝塔教程
  16. MySQL多重嵌套查询
  17. html打开后繁体字怎么变成规范,对HTML标准的思考 - 记解决H5随机显示简繁体汉字问题...
  18. ASP.NET MVC后台判断是否是手机登录以及是否是微信公众号登陆
  19. 爆红十年后,谁“切”了苹果?
  20. 收不到手机验证码怎么办

热门文章

  1. Xcode9学习笔记69 - 创建各种类型的文件(文本、数组、字典、图片)
  2. LINUX查看进程开始时间、结束时间、运行时间
  3. iphone开发学习,UIAlertView的简单改写,popAlertView
  4. 用stream将dgv中的数据导出到word或excel中小例子
  5. 密码6-12位数字和字母组成
  6. 2017百度之星程序设计大赛 - 初赛(A)数据分割
  7. 从0开始学Swift笔记整理(一)
  8. HDU 3397 Sequence operation
  9. POJ 计算几何专项训练(1) 【2318】【2398】【3304】【2653】【1556】【1066】...
  10. 前端(四)——CSS之导入方式、各类选择器