首页 > 其他分享 >Nikitosh 和异或

Nikitosh 和异或

时间:2023-06-13 12:13:30浏览次数:36  
标签:int sum flag trie 异或 ans include Nikitosh

题面

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>

using namespace std;

int bit[32];
int n, a[5211314], sum[5211314];
int l[5211314], r[5211314];

struct Trie {
	int trie[5211314 << 1][2], tot = 1;
	inline void Clear() {
		memset(trie, 0, sizeof(trie));
		return;
	}
	inline void Insert(int a) {
		int p = 1;
		for (int i = 31; i >= 0; -- i) {
			bool flag = (bit[i] & a);
			if (trie[p][flag] == 0) {
				trie[p][flag] = ++ tot;
			}
			p = trie[p][flag];
		}
	}
	inline int Query(int x) {
		int p = 1, ans = 0;
		for (int i = 31; i >= 0; -- i) {
			bool flag = !(bit[i] & x);
			if (trie[p][flag] != 0) {
				p = trie[p][flag];
				ans += flag;
			}
			else {
				flag = !flag;
				p = trie[p][flag];
				ans += flag;
			}
			if (i != 0) ans <<= 1;
		}
		return (x ^ ans);
	}
}tree;

int main() {
	bit[0] = 1;
	for (int i = 1; i <= 31; ++ i) {
		bit[i] = bit[i - 1] << 1;
	}
	cin >> n;
	for (int i = 1; i <= n; ++ i) {
		cin >> a[i];
	}
	tree.Insert(0);
	//要Insert(0),因为题里的l可以等于r
	for (int i = 1; i <= n; ++ i) {
		sum[i] = (sum[i - 1] ^ a[i]);
		tree.Insert(sum[i]);
		l[i] = max(l[i - 1], tree.Query(sum[i]));
		//查询到i的前缀最长异或和
	}
	tree.Clear();
	//记得清空
	memset(sum, 0, sizeof(sum));
	tree.Insert(0);
	for (int i = n; i >= 1; -- i) {
		sum[i] = (sum[i + 1] ^ a[i]);
		tree.Insert(sum[i]);
		r[i] = max(r[i + 1], tree.Query(sum[i]));
		//查询到i的后缀最长异或和
	}
	int ans = 0;
	for (int i = 1; i <= n - 1; ++ i) {
		ans = max(ans, l[i] + r[i + 1]);
		//注意范围
	}
	printf("%d\n", ans);
	return 0;
}

标签:int,sum,flag,trie,异或,ans,include,Nikitosh
From: https://www.cnblogs.com/jueqingfeng/p/17477170.html

相关文章

  • Python实现字符串与指定密钥循环异或加解密
    异或运算在很多密码学算法中都有不同程度的应用,其运算特定在于一个数和另一个数连续异或两次仍得到原来的数。在实际使用中,因为要加密的信息和所使用的密钥在大多数情况下是不等长的,所以经常需要循环使用密钥。defcrypt1(source,key):'''source是要加密或解密的字符串,key是......
  • [科技] 异或哈希
    一个小问题Statement来源:https://www.luogu.com.cn/problem/T297472?contestId=91205给定字符串\(S\),求最长的连续子序列满足其中每个字符都出现了偶数次,求最长长度。\(T\)组询问,\(\displaystyle\sum_{}|S|\leq5\times10^6\)。注:本题暂时只需要通过\(\text{Subtask4}......
  • UOJ91 最大异或和
    最大异或和把区间进行前缀异或相当于差分,我们知道线性基异或后仍是线性基,那么我们在差分后的数列上进行操作。不难发现修改后需要对线性基进行删除,在线的方法看zxy博客吧。注意差分数列(线性基)和原数列是分开处理的,我们对原数列的修改目的是修改线性基,而线性基的维护用上......
  • 位运算(位于、位或、异或、按位取反、位左移、位右移)及相应示例
    一、位运算符运算符含义a&b位与aba^b异或~a按位取反a<<b位左移a>>b位右移二、运算符说明:把他们转化为二进制从低到高按位运算位与(&):当两位都为1时,结果为1,否则为0,在将得出的结果转化为十进制,得出位于的结果位或(|)当且仅当两位都为0时,结果为0,否则为1,在将得出的结果转化为十......
  • acwing 4645. 选数异或
     输出yesnoyes no题意分析,给一串数组,再在每次提问时给出一个区间,l,r;求l,r区间内是否存在两个数,两数异或后值为给出的x;已知a^b=x-->a^x=b;思路:1,把每个数异或x,存在另一个数组(b)里,暴力搜索,看区间内b数组内数字是否有等于a数组内数字,TLE2.记录下标,比较每个......
  • 异或的一些性质
    //异或(不进位加法)0110^1100=1010//相同为0,不同为1//A^A=0//(性质1)A^0=A//(性质2)//一序列相加和异或的值的奇偶性相同a+b+c=d;a^b^c=e;<==>d%2==e%2//奇偶性相同(性质3)<==>d>=e//和值一定大于等于异或......
  • CF1325D(异或构造)1700
    原题链接题目大意:给定整数u和v(0\(\leq\)u,v\(\leq\)\(10^{18}\))试构造长度最短的数组,使得数组内所有元素的异或和为u,加和为v。如果有解,输出两行,第一行输出一个整数n,第二行输出n个非负整数,表示数组里的元素。多解输出任意一组即可。如果无解,输出一行一个整数−1。......
  • 异或:计算整数0~5的累计异或的3种方式
      #示例10-11计算整数0~5的累计异或的3种方式importfunctoolsimportoperator#方法1:n=0foriinrange(1,6):n^=iprint(n)#方法2:x1=functools.reduce(lambdaa,b:a^b,range(6))print(x1)#方法3:x2=functools.reduce(operator.xor,ra......
  • hihoCoder Challenge 28 异或问题 思维
    Givenasequencea[1..n],youneedtocalculatehowmanyintegersSsatisfythefollowingconditions:(1).0≤S<260(2).Foreveryiin[1,n-1],(a[i]xorS)≤(a[i+1]xorS)InputOnthefirstlinethereisonlyoneintegernOnthesecondlinethere......
  • [P8766 [蓝桥杯 2021 国 AB] 异或三角]题解
    P8766[蓝桥杯2021国AB]异或三角题目描述分析题目中给出了三个限制首先我们不妨设\(a,b\ltc\),则而由于我们把\(c\)作为了最大值,原题需要有序对\((a,b,c)\)所以\(ans\ast3\)1.\(1\leqa,b,c\leqn\)2.\(a\oplusb\oplusc=0\)3.\(a+b\gtc\)而在枚举过程中,......