upc 6759 異或序列 莫對演算法 字首異或

2021-08-22 12:59:40 字數 1251 閱讀 1604

題目描述

已知乙個長度為n的整數數列a1,a2,…,an,給定查詢引數l、r,問在al,al+1,…,ar區間內,有多少子串行滿足異或和等於k。也就是說,對於所有的x,y(l≤x≤y≤r),滿足ax⊕ax+1⊕⋯⊕ay=k的x,y有多少組。

輸入輸入第一行為3個整數n,m,k。第二行為空格分開的n個整數,即a1,a2,…,an。接下來m行,每行兩個整數lj,rj,代表一次查詢。

輸出輸出共m行,對應每個查詢的計算結果。

樣例輸入

4 5 1

1 2 3 1

1 41 3

2 32 4

4 4

樣例輸出

421

21

提示

對於30%的資料,1≤n,m≤1000。

對於100%的資料,1≤n,m≤105,0≤k,ai≤105,1≤lj≤rj≤n。

[提交][狀態]

【小結】

這道題算是裸的莫隊演算法了,我們只需要求乙個字首異或就可以了。需要用到異或的一些性質:

如果區間 [i,j] 的異或值為k,則 sum[j]^sum[i-1]=k ; sum[i-1]^k=sum[j]; sum[j]^k=sum[i-1] 

當區間移動時 如果右端點加了乙個值t ,sum[t]=x我們是知道的 所以整個區間的答案增加了 cnt[x^k]個

因為 x^x^k=k;

需要注意到 因為判斷的時候始終要用到左端點的前乙個值 所以我們輸入時直接讓l--;

【**】

#includeusing namespace std;

const int maxn=1e5+3;

int a[maxn];

struct node

p[maxn];

int res=0;

int k;

int ans[maxn],cnt[maxn];//cnt[i]表示區間中字首異或值為i的序列個數

int block;

int cmp(node x,node y)

for(int i=1;i<=q;i++)

block=(int)sqrt(n);

sort(p+1,p+q+1,cmp);

int l=1,r=0;

for(int i=1;i<=q;i++)

for(int i=1;i<=q;i++)

printf("%d\n",ans[i]);

return 0;

}

6759A異或序列

題目描述 已知乙個長度為n的整數數列a1,a2,an,給定查詢引數l r,問在al,al 1,ar區間內,有多少子串行滿足異或和等於k。也就是說,對於所有的x,y l x y r 滿足ax ax 1 ay k的x,y有多少組。輸入輸入第一行為3個整數n,m,k。第二行為空格分開的n個整數,即a1,a...

bzoj5301 異或序列(莫隊演算法)

題目鏈結 description 已知乙個長度為 n 的整數數列 a 1 a 2 a n 給定查詢引數 l r 問在 l,r 區間內,有多少連續子段滿足異或和等於 k 也就是說,對於所有的 x,y l x y r 能夠滿足a x a x 1 a y k的x,y有多少組。input 輸入第一行,為3個...

bzo5301 Cqoi2018 異或序列 莫隊

已知乙個長度為 n 的整數數列 a 1 a 2 a n 給定查詢引數 l r 問在 l,r 區間內,有多少連續子 序列滿足異或和等於 k 也就是說,對於所有的 x,y l x y r 能夠滿足a x a x 1 a y k的x,y有多少組。1 n,m 105,o k,ai 105,1 lj rj n...