洛谷 P1928 外星密码
题目
题目描述
有了防护伞,并不能完全避免 2012 的灾难。地球防卫小队决定去求助外星种族的帮 助。经过很长时间的努力,小队终于收到了外星生命的回信。但是外星人发过来的却是一 串密码。只有解开密码,才能知道外星人给的准确回复。解开密码的第一道工序就是解压 缩密码,外星人对于连续的若干个相同的子串“X”会压缩为“[DX]”的形式(D 是一个整 数且 1≤D≤99),比如说字符串“CBCBCBCB”就压缩为“[4CB]”或者“[2[2CB]]”,类 似于后面这种压缩之后再压缩的称为二重压缩。如果是“[2[2[2CB]]]”则是三重的。现 在我们给你外星人发送的密码,请你对其进行解压缩。
输入输出格式
输入格式:
第一行:一个字符串
输出格式:
第一行:一个字符串
输入输出样例
输入样例#1:
AC[3FUN]
输出样例#1:
ACFUNFUNFUN
说明
【数据范围】
对于 50%的数据:解压后的字符串长度在 1000 以内,最多只有三重压缩。
对于 100%的数据:解压后的字符串长度在 20000 以内,最多只有十重压缩。 对于 100%的数据:保证只包含数字、大写字母、’[‘和’]‘
题解
分治+模拟
注意:当且仅当’[‘后为数字时,才算是压缩,并且’[‘后的数字长度最多为2位
代码(Pascal)
var s,ans:ansistring;
p,w:longint;
procedure init;
begin
readln(s);
end;
function zip(x:longint):ansistring;
var i,time:longint;
q:ansistring;
begin
w:=0;
time:=ord(s[x])-48;q:='';zip:='';
if (s[x+1]<='9')and('0'<=s[x+1]) then begin
time:=time*10+ord(s[x+1])-48;
inc(x);
end;
inc(x);
while (s[x]<>']')or(w<>0) do
begin
if s[x]=']' then dec(w);
if s[x]='[' then
if (s[x+1]>='0')and(s[x+1]<='9') then
begin
q:=q+zip(x+1);
x:=p;
end
else inc(w)
else q:=q+s[x];
inc(x);
end;
p:=x;
for i:=1 to time do
zip:=zip+q;
end;
procedure main;
var i:longint;
begin
i:=1;ans:='';
while i<=length(s) do
begin
if (s[i]='[')and(s[i+1]<='9')and(s[i+1]>='0') then
begin
write(zip(i+1));
i:=p;
end
else write(s[i]);
inc(i);
end;
end;
begin
init;
main;
end.