CF_1113C_Sasha and a Bit of Relax:(扫盲:区间异或)

题意:就是求一段[l,r]使得r-l+1是偶数且 a_l⊕a_l+1⊕…⊕a_mid=a_mid+1⊕a_mid+2⊕…⊕a_r的区间。

解法:如果A^B=C, 那么A=B^C,(两边都是异或上B,自己异或自己等于0),由此可得区间异或的计算:领pre_i为前i个值的异或和,则[l,r]=pre_l-1^pre_r:因为pre_r等于pre_l-1^[l,r]的异或和,再异或一次pre_l-1即得到[l,r],因此区间的异或和可以用前缀异或和运算而得到。可以通过同样的方法推导出符合题意的区间是pre_r==pre_l 且 r和l奇偶性相同的区间(想一想为什么)。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
long long a[maxn],n;
map<long long,int> mp;
int g[maxn][2];
int main(){
 	scanf("%lld",&n);
 	long long res = 0;
 	int len = 0;
 	long long ans = 0;
 	for(int i = 1; i <= n; i++) scanf("%lld",&a[i]);
 	for(int i = 0; i <= n; i++){
  		res = res^a[i];
  		if(!mp[res]) mp[res]=++len;
  		ans += g[mp[res]][i%2];
  		g[mp[res]][i%2]++;
 	}
 	printf("%lld\n",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_41997978/article/details/88869717
BIT