codeforces 665E Beautiful Subarrays
2016-04-21 10:17
323 查看
题目链接
给一个数列, 让你找出异或结果大于等于k的子序列的个数。因为任意一段序列的异或值都可以用前缀异或和来表示, 所以我们先求出前缀异或和。
我们考虑字典树, 对于每一个前缀sum, 我们先查询现有的字典树中有多少个数可以与它异或后大于等于k, 在将这个sum插入到字典树中。 这样就可以求出所有区间的异或情况。
具体操作看代码。
#include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <complex> #include <cmath> #include <map> #include <set> #include <string> #include <queue> #include <stack> #include <bitset> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(x, y) #define lson l, m, rt<<1 #define mem(a) memset(a, 0, sizeof(a)) #define rson m+1, r, rt<<1|1 #define mem1(a) memset(a, -1, sizeof(a)) #define mem2(a) memset(a, 0x3f, sizeof(a)) #define rep(i, n, a) for(int i = a; i<n; i++) #define fi first #define se second typedef complex <double> cmx; typedef pair<int, int> pll; const double PI = acos(-1.0); const double eps = 1e-8; const int mod = 1e9+7; const int inf = 1061109567; const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; struct node { node *next[2]; ll cnt; node() { next[0] = next[1] = NULL; cnt = 0; } }; node *root = new node(); void insert(int x) { //字典树插入 node *p = root; for(int i = 29; i >= 0; i--) { int tmp = x>>i&1; if(!p->next[tmp]) { p->next[tmp] = new node(); } p->cnt ++; p = p->next[tmp]; } p->cnt++; } int query(int x, int k) { ll res = 0; node *p = root; for(int i = 29; i >= 0; i--) { int tmp = x>>i&1; if(k>>i&1) { tmp ^= 1; //如果k这一位是1, 那么如果想要结果大于等于k, 这一位必须向tmp^1这一个方向移动 } else { //否则的话结果一定小于k。 if(p->next[tmp^1]) //如果k这一位是0, 那么答案就可以加上cnt[tmp^1]了。 res += p->next[tmp^1]->cnt; } if(p->next[tmp]) p = p->next[tmp]; else return res; } return res+p->cnt; } int main() { int n, k; cin>>n>>k; int sum = 0, x; ll ans = 0; insert(sum); for(int i = 0; i < n; i++) { scanf("%d", &x); sum ^= x; ans += query(sum, k); insert(sum); } cout<<ans<<endl; return 0; }
相关文章推荐
- LBS基站数据解析接口
- Linux下使Shell 命令脱离终端在后台运行
- jQuery EasyUI使用教程之使用虚拟滚动视图显示海量数据
- Android.os包中一些类的使用
- Python学习笔记05
- 下拉tableView上面的图片放大
- python psutil 进行系统管理 no.2
- Skype for Business支持离线消息啦
- JavaScript预解析及相关技巧分析
- javaScript使用new关键字时发生了什么?
- pthread_cond_wait()函数说明
- 课程练习二-1013-A strange lift
- 再说delegate
- xgboost原理及简单应用
- win10 sql server 2014 服务中需要设置失败后自动重启
- 正则表达式去除html标签
- JDK API 下载
- 石头剪刀布 手势识别
- Git Error
- 随时随地退出应用