https://vijos.org/p/2001

设perXor[i]表示1---i的前缀异或值。

那么要得到某一段的异或值,只需要perXor[j] ^ perXor[i - 1]

那么我们把perXor[n]先加入去字典树,然后用perXor[n - 1]去找,找到的就是下标n的贡献。

同理,然后把perXor[n - 1]插进去,用perXor[n - 2]找,就会是下标n - 1的贡献。因为这个时候它可以是

perXor[n - 2] ^ perXor[n - 1](因为perXor[n - 1]已经在字典树了,)那么这个时候对应的就是a[n - 1] 自己了。

同理它可以是perXor[n - 2] ^ perXor[n],就是a[n - 1] ^ a[n]了。

当然,它还有个m的限制,这个可以加个删除操作即可。

需要注意的是:

1、unsigned int并不是保留低31位,它是对2^32取模,而2^32有33位。

2、字典树的大小要开好,字典树的struct node *pNext[]只需2个即可。因为状态只有0或1

3、判断第i位是否是1或者0,是((1 << i) & val) >= 1 不要忘记判断,不然re

4、cin、cout请取消同步,卡了我TLE

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string> const int maxn = 5e5 + ;
int a[maxn];
int perXor[maxn];
struct node {
int cnt;
struct node * pNext[];
}tree[maxn * ];
int t;
struct node * create() {
struct node *p = &tree[t++];
// p->cnt = 0;
// for (int i = 0; i <= 9; ++i) {
// p->pNext[i] = NULL;
// }
return p;
}
void toInsert(struct node **T, int val) {
struct node *p = *T;
if (p == NULL) {
p = *T = create();
}
for (int i = ; i >= ; --i) {
int id = (( << i) & val) >= ;
if (p->pNext[id] == NULL) {
p->pNext[id] = create();
}
p = p->pNext[id];
p->cnt++;
}
}
void toDel(struct node **T, int val) {
struct node *p = *T;
if (p == NULL) return;
for (int i = ; i >= ; --i) {
int id = (( << i) & val) >= ;
p = p->pNext[id];
p->cnt--;
}
}
int toFind(struct node *T, int val) {
struct node *p = T;
if (p == NULL) return ;
int ans = ;
// cout << val << endl;
for (int i = ; i >= ; --i) {
int id = (( << i) & val) >= ;
if (p->pNext[!id] && p->pNext[!id]->cnt >= ) {
ans |= ( << i);
p = p->pNext[!id];
} else {
p = p->pNext[id];
}
}
return ans;
}
int listToAdd[maxn];
const LL MOD = (1LL << );
void work() {
int n, m;
cin >> n >> m;
for (int i = ; i <= n; ++i) {
cin >> a[i];
}
for (int i = ; i <= n; ++i) {
perXor[i] = perXor[i - ] ^ a[i];
}
// for (int i = 1; i <= n; ++i) {
// cout << perXor[i] << " " ;
// }
// cout << endl;
// unsigned int t = (1LL << 32);
// cout << t << endl;
long long int ans = ;
struct node *T = NULL;
toInsert(&T, perXor[n]);
int len = ;
listToAdd[++len] = perXor[n];
int cur = ;
// cout << toFind(T, perXor[n]) << endl;
for (int i = n - ; i >= ; --i) {
ans += toFind(T, perXor[i]);
if (ans >= MOD) ans %= MOD;
// cout << toFind(T, perXor[i]) << endl;
toInsert(&T, perXor[i]);
listToAdd[++len] = perXor[i];
if (len - cur + > m) {
toDel(&T, listToAdd[cur++]);
}
}
// cout << endl;
cout << ans << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
IOS;
work();
return ;
}

P2001xor-sigma 字典树,然而好坑的更多相关文章

  1. HDU 2072 - 单词数 - [(有点小坑的)字典树模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072 Problem Descriptionlily的好朋友xiaoou333最近很空,他想了一件没有 ...

  2. POJ 2418 字典树

    题目链接:http://poj.org/problem?id=2418 题意:给定一堆树的名字,现在问你每一棵树[无重复]的出现的百分比,并按树名的字典序输出 思路:最简单的就是用map来写,关于字典 ...

  3. hdu 4099 Revenge of Fibonacci 字典树+大数

    将斐波那契的前100000个,每个的前40位都插入到字典树里(其他位数删掉),然后直接查询字典树就行. 此题坑点在于 1.字典树的深度不能太大,事实上,超过40在hdu就会MLE…… 2.若大数加法时 ...

  4. hihoCoder 403 Forbidden 字典树

    题意:给定个规则,个ip,问这些ip是否能和某个规则匹配,如果有多个规则,则匹配第一个.如果没能匹配成功,则认为是"allow",否则根据规则决定是"allow" ...

  5. 字符串hash与字典树

    title: 字符串hash与字典树 date: 2018-08-01 22:05:29 tags: acm 算法 字符串 概述 这篇主要是关于字符串里的 字符串hash 和 字符串字典树,,两个都是 ...

  6. ACM学习历程—Hihocoder 1289 403 Forbidden(字典树 || (离线 && 排序 && 染色))

    http://hihocoder.com/problemset/problem/1289 这题是这次微软笔试的第二题,过的人比第三题少一点,这题一眼看过去就是字符串匹配问题,应该可以使用字典树解决.不 ...

  7. LA_3942 LA_4670 从字典树到AC自动机

    首先看第一题,一道DP+字典树的题目,具体中文题意和题解见训练指南209页. 初看这题模型还很难想,看过蓝书提示之后发现,这实际上是一个标准DP题目:通过数组来储存后缀节点的出现次数.也就是用一颗字典 ...

  8. ACM学习历程—HDU2222 Keywords Search(字典树)

    Keywords Search Description In the modern time, Search engine came into the life of everybody like G ...

  9. HRBUST 2072:萌萌哒十五酱的礼物~(树,字典树)

    题意:n个点的一棵树,树的边上有权值.一条路径的权值定义成这条路径上所有边的权值的xor.问所有路径的最大权值是多少. 思路: 首先,树上任意两点之间的路可以表示成 这两点到根节点的路- 其最近公共祖 ...

随机推荐

  1. There is already an open DataReader associated with this Command which must be closed first." exception in Entity Framework

    Fixing the "There is already an open DataReader associated with this Command which must be clos ...

  2. unity, terrain道出为obj

    http://wiki.unity3d.com/index.php?title=TerrainObjExporter

  3. 调试技巧--Windows端口号是否被占用

    调试技巧--Windows端口号是否被占用 一.端口概念 10.0.0.0~10.255.255.255,172.16.0.0~172.16.255.255, 192.168.0.0~192.168. ...

  4. Eclipse下新建Maven项目、自动打依赖jar包

    当我们无法从本地仓库找到需要的构件的时候,就会从远程仓库下载构件至本地仓库.一般地,对于每个人来说,书房只有一个,但外面的书店有很多,类似第,对于Maven来说,每个用户只有一个本地仓库,但可以配置访 ...

  5. [内核]Takslet和Workqueue的应用场景

    转自:http://blog.chinaunix.net/uid-20382483-id-4077101.html tasklet Workqueue 处于atomic context,不能sleep ...

  6. ADF_Controller系列1_绑定TasksFlow、Region和Routers(Part1)

    2015-02-14 Created By BaoXinjian

  7. 【knowledgebase】不要在一个很大的RDD上调用collect

    如果一个RDD很大以至于它的所有元素并不能在driver端机器的内存中存放下,请不要进行如下调用: val values = myVeryLargeRDD.collect()   collect将尝试 ...

  8. 记一个eclipse 错误 Undefined variable from import: randrange

    我自己定义了一个random.py   和pev的包含路径一样的 解决办法是: 出现这种问题,可以import 这个模块,print 这个模块

  9. IOS简单的字串替换方法stringByTrimmingCharactersInSet 和空格的替换 ()

    NSString *str = @"一个 (ABC) #@!#^#G@#Dd21e12d!E@!212s012yhsn 汉0932字#@!中..文//>?输~~~@#$#@%#^#^% ...

  10. vbs脚本要求在cmd中输入输出用StdIn ,StdOut

    Dim StdIn, StdOutSet StdIn = WScript.StdInSet StdOut = WScript.StdOut Do While Not StdIn.AtEndOfStre ...