3. Булева функцияvar
n,i,j,k,b:longint;
t,h1,h2:array[1..100000,0..1] of longint;
f:string;
s:array[1..100000] of integer;
begin
readln(n);
readln(f);
{ заполнение таблицы }
t[1,0]:=0;
t[1,1]:=1;
h2[1,0]:=0;
h2[1,1]:=1;
for i:=2 to n do
begin
t[i,0]:=-1;
t[i,1]:=-1;
for j:=0 to 1 do
for k:=0 to 1 do
begin
b:=ord(f[j*2+k+1])-ord('0'); { вычисляем значение f(j,k) }
if (t[i-1,j]>=0) and (t[i,b]<t[i-1,j]+k) then
begin
t[i,b]:=t[i-1,j]+k;
h1[i,b]:=j; { запоминаем способ }
h2[i,b]:=k; { получения результата }
end;
end;
end;
{ обратная трассировка }
if t[n,1]<0 then
writeln('No solution')
else
begin
j:=1;
for i:=n downto 1 do
begin
s[i]:=h2[i,j];
j:=h1[i,j];
end;
for i:=1 to n do
write(s[i]);
writeln;
end;
end.
| Булева функция | Последовательность |
| ???1 | 111...111 |
| 1??0 | 111...110 |
| 01?0 | 111...101 для четных `n` и 111...111 для нечетных `n` |
| 0010 | 100...000 |
| 0000 | No solution |