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 密碼開啟後,裡面有書籍卡片,裡面...