1. 程式人生 > >小Q的無敵異或 -- 所有區間的異或和

小Q的無敵異或 -- 所有區間的異或和

給定一個長度為n的非負整數序列{An},求序列的所有子區間異或值之和模998244353,和所有子區間之和的異或值。
n≤105,Ai≤106。

題解:
先考慮第一問。
令xor(i)表示前i項的異或值,xor(l,r)表示第l項到第r項的異或值,那麼xor(l,r)=xor(r)⊕xor(l−1)。
考慮xor(l,r)的二進位制第k位是1的可能情況,當且僅當xor(r)和xor(l−1)的二進位制第k位不同。
那麼我們可以固定右端點r,算出有多少個l使xor(l,r)的第k位是1,假設已經算出右端點為r的答案,現在可以O(1)推到右端點為r+1的答案,因為對於r+1來說新增的l只有r+1一個,只需要O(1)將貢獻產生即可。時間複雜度O(nlogA)。
Mycode:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
int sum[maxn],a[maxn],c[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    sum[0] = 0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        sum[i] = sum[i]^a[i];
    }
    int ans = 0;
    for(int k=0
;k<=29;k++) { c[0] =1 ,c[1] =0; for(int i=1;i<=n;i++) { int v = (sum[i]&(1<<k))?1:0; ans+=((1<<(k))*c[v^1])%mod; c[v]++; } } cout<<ans<<endl; return 0; }

1 拆位做法
2 題目連結
3 第二問做法
第二問做法2


第二問做法3
官方題解
4 其他異或問題
5 更多異或問題:最大異或和
異或之

相關推薦

Q無敵 -- 所有區間

給定一個長度為n的非負整數序列{An},求序列的所有子區間異或值之和模998244353,和所有子區間之和的異或值。 n≤105,Ai≤106。 題解: 先考慮第一問。 令xor(i)表示

BZOJ4017:Q無敵

長度 原因 stat con sum nlog 之前 時間復雜度 solution Link 題意:有一個長度為 \(N\) 的數列,求其 \[\sum 所有子數列異或和\] 以及\[XORSUM \{子數列求和\}\] \(1 \leq N \leq 10^5,元素 0

bzoj4017 Q無敵 數學

        一般和異或相關的求和都是一位一位來的。這題也一樣。        首先看第一問。令sum[i]=a[1]^a[2]^...^a[i],那麼xor(l,r)=sum[l-1]^sum[r

xian 區域賽 g bzoj 4017: Q無敵

 求任意區間的異或和  sum(  i<j  ) 列舉右端點,記錄左端點中有多少能和它異或產生貢獻的左端點 #include <iostream> #include <cst

2017.10.12 Q無敵 失敗總結

第一問是可以O(n)的 二進位制位是獨立的,所以直接分開算即可。。 記一個字首和,開桶裝0、1的個數     然後每次新加入一個點就直接更新就可以了 第二問就比較難了,,手玩只能發現最低位可以這麼搞,對於高位還要考慮借位情況,借位情況有0有1,就不好離散 但是這麼做是可以

U14739 X ask Y III 子區間

很多 display c++ space code ask lose eps 區間 題意:就是求所有子區間的異或和的和 題解:就是算每一位對結果的貢獻(最近好像遇到很多次這種題目),先前綴異或,從左向右掃記錄二進制前綴的1,0個數,xor[i]==xor[j]^1的時候就

Codeforce 1054 D. Changing Array —— 區間

At a break Vanya came to the class and saw an array of n k-bit integers a1,a2,…,an on the board. An integer x is called a k-bit integer if 0≤x≤2k−

BZOJ5220: [Lydsy2017省隊十連測]區間

傳送門 題解: 首先字首異或處理一下,變成一堆數中兩個異或為kkk。 顯然這是一一對應的關係,如果一對數中兩個都小於n\sqrt{n}n​個,直接暴力O(nn)O(n\sqrt{n})O(nn​)解決。 否則在序列上O(n)O(n)O(n)解決一對數。 時間複雜

Codeforce 1054 D. Changing Array —— 區間

At a break Vanya came to the class and saw an array of n k-bit integers a1,a2,…,an on the board. An integer x is called a k-bit int

紅球進黑洞(線段樹區間+區間求和)

題目連結: 紅球進黑洞 題意: 給定一個長度為 n 的序列,有 m 次操作: 操作有2種: 1. 區間求和,即輸入l,r,輸出 . 2. 區間異或,即輸入l,r,k,對於,將 a[i] 變為 . 資料範圍: , 思路: 我們無法得到一個區間更新的

【codeforces 617E XOR and Favorite Number】【莫隊分塊】【多次查詢求區間[l,r]中區間等於k的子區間個數】

【連結】 【題意】 給定一個數組,多次查詢,問區間l,r中有多少個子區間滿足區間異或為k 【思路】 查詢很大,意味著每次回答的時間複雜度不能太大。對於本題,我們可以維護一個字首異或,sum[i],區間[a,b]異或為k等價於sum[a-1]^sum[b]=k,假如

[cqbzoj]區間最大值

奶牛異或 時間限制: 1 Sec 記憶體限制: 64 MB 題目描述 農民約翰在餵奶牛的時候被另一個問題卡住了。他的所有N(1 <= N <= 100,000)個奶牛在他面前排成一行(按序號1..N的順序),按照它們的社會等級排序。奶牛#

序列子區間問題(西安電子科技大學第16屆程式設計競賽 E Xieldy And His Password,U14739 X ask Y III 子區間、牛客練習賽16 E求值)

序列子區間問題一般都是問你,求序列子區間的和的和...異或和的和..和的異或和...和是3的倍數的個數... 這類問題一般都是用(字首和+)記錄狀態的陣列來實現,將O(n*n)的複雜度降為O(k*n)(k為常數) 這類問題可以從如何優化遍歷以i為結尾的連續子序列的複雜

FindKth(T,i)返回樹T的具有第i個最關鍵字的元素。所有元素具有關鍵字互的關鍵字。修改二叉樹以平均O(logN)時間支援這種運算

資料結構與演算法分析——c語言描述 練習4.44 答案 用了以前的生成前N個自然數的一個隨機置換程式碼。 tree.h typedef int ElementType; #ifndef _Tree_H #define _Tree_H struct TreeNode;

Mishka and Interesting sum 區間+樹狀陣列+離線處理

知識:樹狀陣列 題意: 給你n個數,然後詢問q次,每次詢問查詢區間[l,r]裡的出現過偶數次的那些數的亦或值 解析: 首先是出現偶數次,到底是哪些數。 設Al為整個區間的異或,Odd為區間內奇數次的數的異或,Even為區間內出現偶數次的數的異或(E

BZOJ 4260 Codechef REBXOR (區間最值)【01字典樹】

兩個 font pri ech c++ def print char ret <題目鏈接> 題目大意:給定一個序列,現在求出兩段不相交的區間異或和的最大值。 解題分析: 區間異或問題首先想到01字典樹。利用前綴、後綴建樹,並且利用異或的性質,相同的兩個數異

Atcoder Beginner Contest 121 D - XOR World(區間)

出了 one href show log 就是 isp () www. 題目鏈接:https://atcoder.jp/contests/abc121/tasks/abc121_d 題目很裸(Atcoder好像都比較裸 就給一個區間求異或和 n到1e12 肯定

Codeforces 811C Vladik and Memorable Trip (區間最大值)【線性DP】

所有 一個 true sin %d 如果 不同 esp ace <題目鏈接> 題目大意: 給你n個數,現在讓你選一些區間出來,對於每個區間中的每一種數,全部都只能出現在這個區間。 每個區間的價值為該區間不同的數的異或值之和,現在問你這n個數最大的價值是多少。

求數組所有區間最大值減去最值之差的(貝殼筆試題)

min pre clu 時間復雜度 print ide turn scan close 這個題直接暴力求解的話時間復雜度肯定是不行的,所以,我們要計算每個數值的貢獻,對每一個數求他當最小值當了多少次,當最大值當了多少次,最後當最大值的次數乘以這個數值減去當最小值的次數乘以

【LeetCode 簡單題】98-找到字串中所有字母位詞

宣告: 今天是第98道題。給定一個字串 s 和一個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上