01串變換問題

2022-03-23 17:01:43 字數 2730 閱讀 6803

題目大意:給你一些操作(操作和串的長度一樣,操作的每一位對應串的每一位),一些串和它的目標串,求出把它變換成目標串的最小操作次數。

串的長度len<=20,操作方式m<=50,n<=4

考慮到直接列舉所有操作並且每次對每一位進行操作會很慢,又都是01串,很容易想到位運算。

把每乙個串都看成乙個二進位制數,修改為1等價於or 1,修改為0為and 0,取反為xor 1。

所以建立三個陣列,c0,c1,cqf表示三種運算,乙個操作則對應三個二進位制數。

這樣狀態就可以o(1)的轉移。

program

neayo;

const

inf='

quantum.in';

ouf='

quantum.out';

vari,j,k,len,now,target,min,m,n:longint;

a:array[0..4]of

longint;

c0,c1,cqf:

array[0..51]of

longint;

h:array[0..2097152] of

boolean;

q,qt:

array[0..1000000]of

longint;

procedure

bfs;

vari,tmp,time,top,closed:longint;

begin

time:=0; top:=0;closed:=1;q[1]:=now;qt[1]:=0

;

repeat

inc(top);

if top>1000000

then top:=1

; now:=q[top];

for i:=1

to m do

begin

tmp:=now and

c0[i];

tmp:=tmp or

c1[i];

tmp:=tmp xor cqf[i];

inc(time);

ifnot h[tmp] then

begin

h[tmp]:=true;

inc(closed);

if closed>1000000

then closed:=1

; q[closed]:=tmp;

qt[closed]:=qt[top]+1

;

if qt[closed]=6

then

closed:=closed;

if tmp=target then

begin

writeln(qt[closed]);

exit;

end;

end;

end;

until(h[target] or (time>100000000000)or (top>=closed));

writeln('np

');end;

procedure

init;

vars:string;

begin

assign(input,inf);assign(output,ouf);

reset(input);rewrite(output);

readln(len,m,n);

for i:=1

to m do

begin

readln(s);

for j:=1

to len do

begin

if s[j]<>'c'

then c0[i]:=c0[i]+(1 shl (len-j));

if s[j]='s'

then c1[i]:=c1[i]+(1 shl (len-j));

if s[j]='f'

then cqf[i]:=cqf[i]+(1 shl (len-j));

end;

end;

for i:=1

to n do

begin

fillchar(h,sizeof(h),false);

readln(s);

now:=0;target:=0

;

for j:=1

to len do

if s[j]='1'

then now:=now+(1 shl (len-j));

delete(s,

1,len+1

);

for j:=1

to len do

if s[j]='1'

then target:=target+(1 shl (len-j));

if now=target then

begin

writeln(0);

continue;

end;

h[now]:=true;

bfs;

end;

close(input);

end;

begin

init;

close(output);

end.

CF591CF01串的變換,找規律

這題知道應該是乙個規律題,然而並沒有什麼卵用,規律找不到,ac不了,前面倆題手速不夠快,只能掉rating。說一下這題的規律 首先只有101和010會變化,很明顯可以知道,然後開個陣列,記錄需要變化的位置,然後每一段需要變化的01串需要交換的次數為 len 1 2 然後變化的規律 具體細節看 另外貼...

01串的排序問題 演算法

01 串的排序問題 code 首先按長度排序,長度一樣,按 1 的個數排序,1 的個數一樣時,就按ascii排序 include include include include include if there is not included fstream libary we will get t...

整數變換問題

problem description 整數變換問題。關於整數i的變換f和g定義如下 f i 3i 試設計乙個演算法,對於給定的2 個整數n和m,用最少的f和g變換次數將n變換為m。例如,可以將整數15用4 次變換將它變換為整數4 4 gfgg 15 當整數n不可能變換為整數m時,演算法應如何處理?...