比赛 20141105 评测结果 AAAAAAAAAAAAAATTTTTT
题目名称 神奇的压缩机 最终得分 70
用户昵称 东方老败 运行时间 6.244 s
代码语言 Pascal 内存使用 0.20 MiB
提交时间 2014-11-05 11:39:39
显示代码纯文本
var n,i,j,k,a,b,l,o1,o2,o3:longint;
    s:array[0..5013]of ansistring;
	f:array[0..5013]of longint;
	u,v,t,p,q:ansistring;
        ch:char;

procedure init;
begin
i:=1;
while not seekeoln do
begin
read(ch);
s[i]:=s[i-1]+ch;
s[0]:=s[0]+ch;
inc(i);
end;
l:=i-1;
while s[0,l]=' ' do
begin
 delete(s[0],l,1);
 dec(l);
end;
readln(a,b);
end;

function min(x,y:longint):longint;
begin
if x<y then exit(x);exit(y);
end;

procedure work;
begin
fillchar(f,sizeof(f),$7f);
f[0]:=0;
for i:=1 to l do
begin
 f[i]:=f[i-1]+a;
 for j:=(i+1) div 2 to i-1 do
 begin
  u:=s[i];delete(u,1,j);
  k:=pos(u,s[j]);
  if k=0 then continue;
  if (k<>0)and(f[j]+b<f[i]) then f[i]:=f[j]+b;
  p:=s[j];o3:=k;
  repeat p[o3]:=' ';k:=pos(u,p);if k=0 then break;o3:=k;until false;
  k:=o3;
  o1:=j-k+1;v:=copy(s[j],j-o1+1,o1);o2:=j-o1;
  repeat
   if o2-o1<0 then break;
   t:=copy(s[o2],o2-o1+1,o1);
   if t<>v then break;
   if f[o2]+b<f[i] then f[i]:=f[o2]+b;
   o2:=o2-o1;
  until false;
  end;
//writeln(i,' ',f[i],' ');
end;
writeln(f[l]);
end;

begin
assign(input,'WinCHG.in');reset(input);
assign(output,'WinCHG.out');rewrite(output);
init;
work;
close(output);
end.