BZOJ1080 暴力 位移運算子的用法

2022-06-13 17:06:09 字數 1959 閱讀 8153

time limit: 10 sec  memory limit: 162 mb

submit: 337  solved: 148

[submit][status][discuss]

乙個編碼方案把每個字元對應到乙個01串。例如就是乙個編碼方案,它把四個字元(假設

它們為a,b,c,d)分別對應到串1、1010,01,10101。字串的編碼為各字元編碼的連線。例如,在剛才的編碼方

案中,字串cac的編碼為01101,dcb的編碼為10101011010。 進一步分析發現,剛才的編碼是相當劣質的,因為

字串ba, acc和d的編碼都是10101。對於乙個編碼方案,你的任務是找出三個不同的字串,使得它們的編碼全

相同。換句話說,找乙個01編碼串,使得它至少有三種解碼方式。如果有多組解,這個編碼串應當盡量短。

第一行包含乙個整數n,即符號的個數。以下n行每行為乙個長度不超過50的01串(可能為空串),即各符號的

編碼。僅一行,包含乙個整數,即最短編碼的長度。如果無解,輸出-1。41

1010

0110101

5

#include#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef vector

ve;mapint>hash;

queue

q;string s[35

];int

n;void

work()

else u.push_back(i<<6

);    hash[u]=0

;    q.push(u);

while(!q.empty())

else v.push_back(which<<6|where

);            }

if(cnt>=3)

sort(v.begin(),v.end());

t.clear();

for(int i=0;ii)

if(i<2||v[i]^v[i-2]) t.push_back(v[i]);     //

必須是i=2)的形式,因為題幹要求3個即可退出

int &th=hash[t];

if(t.size()&&!th) th=x+1

,q.push(t);}}

puts("-1

");}int

main()

#include#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef vector

ve;mapint>hash;

queue

q;string s[35

];int

n;void

work()

else u.push_back(i<<6

);    hash[u]=0

;    q.push(u);

while(!q.empty())

else v.push_back(which<<6|where

);            }

if(cnt>=3)

sort(v.begin(),v.end());  

//也可以直接將v壓入佇列,但是要先排序

int &th=hash[v];

if(v.size()&&!th) th=x+1

,q.push(v);}}

puts("-1

");}int

main()

位移運算子

位移運算子 直接操作二進位制數,運算速率更快。按位非 not 把1變成0,把0變成1 超出運算範圍,變成負數 var a 25 var b a b 25的 二進位制數 00000000000011001 轉化後 11111111111100010 結果為 26 總結非運算 乙個數與自身的取反值相加等...

java 位移運算子

import org.junit.test 1 左移運算子 2 右移運算子 測試正數 3 右移運算子 測試負數 4 無符號右移 測試正數 5 無符號右移 測試負數 public class weiyitest 右移運算子 測試正數 1010001001 test public void test2 ...

c 位移運算子

左移運算子 將第乙個運算元向左移動第二個運算元指定的位數,空出的位置補0。例如 1100100 2 110010000,1100100左移兩位後為 1100100口口,補0後為110010000。右移運算子 將第乙個運算元向右移動第二個運算元所指定的位數,空出的位置補0。例如 1100100 2 0...