牛客 每日一題 Xorto 題解(異或 字首和)

2021-10-05 07:23:05 字數 939 閱讀 4087

選取任意不重疊的兩個區間,使異或結果為0

前言已經想到了用字首和優化就是不知道該怎麼判斷他們不是重疊

正文暴力是列舉兩個區間左右端點,但是顯而易見會tle,我們可以考慮只列舉其中乙個區間[x,y],這個區間的異或和可以很容易的在o(1)時間複雜度通過字首異或和求得。如果我們規定[x,y]是右邊的那個區間,實際上我們需要知道的是,左邊有多少個區間的異或和與[x,y]的異或和相等。

我們可以用乙個類似桶排序的桶的陣列cnt[i]來表示當前位置左邊異或和為i的區間的個數,這個當前位置其實是就是上面那個x。而顯然以x-1為右界的區間在之前就統計了,所以我們只需要再列舉乙個j,表示i為右界的時候區間的左界,然後把區間的情況都加入到cnt陣列裡。這個j的列舉和上面y的列舉是並列的,演算法時間複雜度是o(n^2)

發現列舉右端點是真的可以解決很多題目

注意1:mp的陣列範圍為1<<17是因為異或是不進製的加法(1<<17)>1e5,則按二進位制來算在第18位來算不可能是1

2:ans為long long

#include

#include

using

namespace std;

const

int maxn=

1e3+5;

int a[maxn]

,sum[maxn]

,mp[

1<<17]

,n,cnt;

long

long ans;

//注意ans要用ll

intmain()

for(

int r=

1;r<=n;r++

)for

(int k=r+

1;k<=n;k++)}

printf

("%lld\n"

,ans)

;return0;

}

數碼 牛客每日一題

題意 給定兩個整數 l 和 r 對於所有滿足 1 l x r 10 9 的 x 把 x 的所有約數全部寫下來。對於每個寫下來的數,只保留最高位的那個數碼。求1 9每個數碼出現的次數。思路 可以轉化為1到 r 的問題,列舉約數 a,找到有多少約數 b,使得 a b 在1 到 r 的範圍內。統計數量。a...

牛客每日一題 保護花

題目連線 這個很明顯是貪心,推導一下公式 假設這一群牛中有a b這兩頭,他們的值分別是ati adi,bti bdi,並且已經知道了總的di值sdi 假設先運a牛就是比先運b牛好,說明先運a牛總的損壞低 則有 sdi adi 2 ati sdi bdi 2 bti 可以發現當 adi 越高 ati越...

每日一題力扣389 異或神奇操作

給定兩個字串 s 和 t,它們只包含小寫字母。字串 t 由字串 s 隨機重排,然後在隨機位置新增乙個字母。請找出在 t 中被新增的字母。class solution def findthedifference self,s str,t str str 初始化 ans 為 0 ans 0 對字串 s ...