XOR and Favorite Number CodeForces - 617E

a[i]^a[i+1]……a[j]=k;
处理前缀和pre[i]
那么上式可以表示为pre[i-1]^pre[j]=k;

#include<bits/stdc++.h>
using namespace std;
const int N=1<<20;
struct node{
	int l,r;
	int id;
}q[N];
int pos[N];
long long ans[N];
//每个前缀值出现的次数 
long long flag[N];
int a[N];
bool cmp(node a,node b)
{
	//如果左端点在同一块中,按右端点排序 
	if(pos[a.l]==pos[b.l])
		return a.r<b.r;
	//否则,按照块来排序 
	return pos[a.l]<pos[b.l];
}
int n,m,k;
int l=1,r=0;
long long Ans=0;
void add(int x)
{
	//当前 前缀和出现的次数-- 
	Ans+=flag[a[x]^k];
	flag[a[x]]++;
} 
void del(int x)
{
	//当前 前缀和出现的次数-- 
	flag[a[x]]--;
	//总的减去 
	Ans-=flag[a[x]^k];
}
int main()
{
	cin>>n>>m>>k;
	int sz=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		//处理前缀和 
		a[i]=a[i]^a[i-1];
		//分块 
		pos[i]=i/sz;
	}
	for(int i=1;i<=m;i++)
	{
		cin>>q[i].l>>q[i].r;
		q[i].id=i;
	}
	sort(q+1,q+1+m,cmp);
	flag[0]=1;
	for(int i=1;i<=m;i++)
	{
		while(l<q[i].l)
		{
			del(l-1);
			l++;
		}
		while(l>q[i].l)
		{
			l--;
			add(l-1);
		}
		while(r<q[i].r)
		{
			r++;
			add(r);
		}
		while(r>q[i].r)
		{
			del(r);
			r--;
		}
		ans[q[i].id]=Ans;
	}
	for(int i=1;i<=m;i++)
		cout<<ans[i]<<endl;
	return 0;
}
posted @ 2020-02-28 17:17  晴屿  阅读(106)  评论(0编辑  收藏  举报