ZZULIOJ 2133 密室逃脫 思維 字典樹

2021-08-01 06:26:10 字數 1507 閱讀 7002

time limit: 1 sec  

memory limit: 128 mb

submit: 391  

solved: 79

submit

status

web board

xor在玩密室逃脫,在某一關中,桌上有乙個一張紙,上面寫著「請根據所給例子求解答案從而獲得密碼」,下面寫了幾個字串「01 10 11」,而答案為「6」,聰明的xor立馬就知道了這是給出一些二進位制數字s,求存在多少對有序二元組(i,j)使得s[i]^s[j]第一行乙個整數t,表示資料組數。

對於每組資料,首先讀入兩個整數n,m(n*m<=1000000),接下來為n行,每行為乙個長度為m的01串,表示乙個二進位制數字

對於每個資料,輸出乙個整數x,表示二元組數目1

3 2 01

10 116

思路:1、位運算操作肯定我們要從位運算下手。2進製亦或運算對於一位來講有四種情況:

①1^1==0 會將當前值變小。

②1^0==1 當前值沒有變。

③0^1==1 當前值變大了。

④0^0==0 當前值沒有變。

那麼其中只有①和③會影響到s【i】^s【j】和s【i】比較的結果。

很顯然,如果從高位到低位進行分析的話,如果第1位發生了①,那麼之後無論多少位子發生了③都是使得s【i】^s【j】同理,如果第1位發生了③ ,那麼之後無論多少位子發生了①都是使得s【i】^s【j】>s【i】;

所以我們不妨將問題轉化成字典樹問題。

2、每一次輸入進來乙個01串我們都入樹。

那麼對於查詢,我們每個字串都要遍歷到,每個字串在find統計的過程中,遵循下列兩個原則即可:

①如果當前是1.統計字首到此處為1的字串數量,然後接下來去遍歷0.

②如果當前是0.我們肯定是接下來去遍歷0.

3、過程維護一下即可,注意細節以及優化點,950+ms過的,出題人資料真的多。

ac**:

#include#include#include#includeusing namespace std;

#define ll long long int

#define maxn 2

typedef struct tree

tree;

ll n,m;

tree root;

void init()

p->nex[id]=q;

}else

p=p->nex[id];

}}ll find(char *str)

else return ans;

}if(id==1)

else return ans;}}

return ans;

}int main()

{ ll t;

scanf("%lld",&t);

while(t--)

{init();

scanf("%lld%lld",&n,&m);

char a[n+2][m+2];

for(ll i=0;i

zzulioj 2133 密室逃脫

2133 密室逃脫 time limit 1 sec memory limit 128 mb submit 163 solved 19 submitstatusweb board description xor在玩密室逃脫,在某一關中,桌上有乙個一張紙,上面寫著 請根據所給例子求解答案從而獲得密碼 ...

密室逃脫 dp

題目大意 有n個房間,i和i 1之間有扇門,能被開啟當且僅當第i個房間有ai個人按下按鈕或者第i 1個房間有bi個人按下按鈕。門開啟後人可以雙向通過。按按鈕的人不能移動,一旦放開按鈕門就會關死。現在要求你在每個房間放一些人,使得放的總人數最多,並且不存在一種方案使得第1個房間有至少m個人。n 100...

真人密室逃脫 魔戒

1 找到魔戒,將魔戒放入乙個箱子中間的孔中,箱子即開啟。魔戒一般有磁性,吸附在燈的支架上 2 開啟箱子,取出其中的書籍,根據書籍正面的文字找出人族的那個說明文件,裡面有年數。年數是其中乙個密碼鎖的密碼。書的背面是過215年後,指該年數加215,是另外乙個鎖的密碼。3 密碼開啟後,裡面有書籍卡片,裡面...