題目描述
已知乙個長度為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...