88 lines
1.5 KiB
Plaintext
88 lines
1.5 KiB
Plaintext
type sni = record
|
|
s : ansistring;
|
|
n : integer
|
|
end;
|
|
|
|
var
|
|
f : text;
|
|
s : ansistring;
|
|
op, cl : integer;
|
|
c : char;
|
|
|
|
function cal(s : ansistring) : integer;
|
|
var
|
|
c : char;
|
|
tmp : integer = 0;
|
|
begin
|
|
cal := 0;
|
|
for c in s do
|
|
if c = '(' then
|
|
begin
|
|
inc(tmp);
|
|
if tmp > cal then
|
|
cal := tmp
|
|
end
|
|
else
|
|
begin
|
|
dec(tmp);
|
|
if tmp < 0 then exit(0)
|
|
end;
|
|
if tmp <> 0 then
|
|
exit(0)
|
|
end;
|
|
|
|
function rplc(
|
|
s : ansistring;
|
|
c : char;
|
|
idx : integer
|
|
) : ansistring;
|
|
begin
|
|
exit(copy(s, 1, idx - 1) + c + copy(s, idx + 1, length(s) - idx + 1))
|
|
end;
|
|
|
|
function libtn(
|
|
s : ansistring;
|
|
op, cl, idx : integer
|
|
) : sni;
|
|
var
|
|
i : integer;
|
|
v0, v1 : sni;
|
|
begin
|
|
if (op = 0) and (cl = 0) then
|
|
begin
|
|
libtn.s := s;
|
|
libtn.n := cal(s);
|
|
exit
|
|
end;
|
|
i := idx;
|
|
while s[i] <> '?' do
|
|
inc(i);
|
|
if op = 0 then
|
|
exit(libtn(rplc(s, ')', i), 0, cl - 1, i + 1));
|
|
if cl = 0 then
|
|
exit(libtn(rplc(s, '(', i), op - 1, 0, i + 1));
|
|
v0 := libtn(rplc(s, '(', i), op - 1, cl, i + 1);
|
|
v1 := libtn(rplc(s, ')', i), op, cl - 1, i + 1);
|
|
if v0.n > v1.n then
|
|
exit(v0)
|
|
else exit(v1)
|
|
end;
|
|
|
|
begin
|
|
assign(f, 'BTN.INP');
|
|
reset(f);
|
|
read(f, s);
|
|
close(f);
|
|
op := length(s) div 2;
|
|
cl := length(s) div 2;
|
|
for c in s do
|
|
if c = '(' then
|
|
dec(op)
|
|
else if c = ')' then
|
|
dec(cl);
|
|
assign(f, 'BTN.OUT');
|
|
rewrite(f);
|
|
writeln(f, libtn(s, op, cl, 1).s);
|
|
close(f)
|
|
end.
|