type node=record
name:array [1..3] of string;
data:longint;
end;
link=^node2;
node2=record
data:string;
wz:integer;
next:link;
end;
var b:array [1..250] of node;
a:array [1..199] of string;
f:array [1..199,1..199] of longint;
st:string;
ch:char;
m,i,n:integer;
j,ans:longint;
pp,qq,head:link;
function save2(l:string;var top:integer):boolean;
var k,code:integer;
begin
if b[i].name[top][1]=’0’ then top:=top-1 else
if b[i].name[top][2] in [’0’..’9’] then exit(true) else
if b[i].name[top][1] in [’4’..’9’] then exit(true) else
if b[i].name[top][1] in [’1’..’3’] then
begin
val(copy(b[i].name[top],1,1),k,code);
delete(b[i].name[top],1,1);
delete(l,1,1);
while k>1 do
begin
top:=top+1;
b[i].name[top]:=l;
k:=k-1;
end;
end;
if top>3 then exit(true)
else exit(false);
end;
function check:boolean;
var k,r:integer;
flag:boolean;
begin
for k:=1 to 3 do
begin
flag:=false;
for r:=1 to n do
if b[i].name[k]=a[r] then
begin
flag:=true;
break;
end;
if not(flag) then exit(true);
end;
exit(false);
end;
function save(l,r:string):boolean;
var top,code:integer;
begin
top:=0;
while (pos(’+’,l)>0) and (top<=2) do
begin
top:=top+1;
b[i].name[top]:=copy(l,1,pos(’+’,l)-1);
if save2(b[i].name[top],top) then exit(true);
delete(l,1,pos(’+’,l));
end;
top:=top+1;
b[i].name[top]:=l;
if save2(l,top) then exit(true);
if top<>3 then exit(true);
if check then exit(true);
if r[1]=’+’ then
begin
delete(r,1,1);
val(r,b[i].data,code);
end
else
begin
if r[1]=’-’ then delete(r,1,1);
val(r,b[i].data,code);
b[i].data:=-b[i].data;
end;
exit(false);
end;
function max(l,r:longint):longint;
begin
if l>r then exit(l);
exit(r);
end;
function give(x,y,z:integer):longint;
var k:integer;
begin
for k:=1 to m do
if (b[k].name[1]=a[x]) and (b[k].name[2]=a[y]) and (b[k].name[3]=a[z]) or (b[k].name[1]=a[x]) and (b[k].name[2]=a[z]) and (b[k].name[3]=a[y]) or (b[k].name[1]=a[y]) and (b[k].name[2]=a[x]) and (b[k].name[3]=a[z]) or
(b[k].name[1]=a[y]) and (b[k].name[2]=a[z]) and (b[k].name[3]=a[x]) or (b[k].name[1]=a[z]) and (b[k].name[2]=a[x]) and (b[k].name[3]=a[y]) or (b[k].name[1]=a[z]) and (b[k].name[2]=a[y]) and (b[k].name[3]=a[x]) then exit(b[k].data);
exit(0);
end;
function digit(p:link):longint;
var q,r,s,t:link;
sum:longint;
begin
if p=nil then exit(0);
if p^.next=nil then exit(0);
if p^.next^.next=nil then exit(0);
if p^.next^.next^.next=nil then exit(give(p^.wz,p^.next^.wz,p^.next^.next^.wz));
q:=p;
r:=nil;
sum:=0;
while (q^.next<>nil) and (q^.next^.next<>nil) and (q^.next^.next^.next<>nil) do
begin
new(t);
t^.data:=q^.data;
t^.wz:=q^.wz;
t^.next:=q^.next^.next^.next;
if r=nil then
begin
r:=t;
s:=r;
end
else
begin
r^.next:=t;
r:=t;
end;
sum:=max(sum,digit(s)+give(q^.wz,q^.next^.wz,q^.next^.next^.wz));
q:=q^.next;
end;
digit:=sum;
end;
begin
readln(n);
for i:=1 to n do
a[i]:=’’;
i:=1;
while not(eoln) do
begin
read(ch);
if ch<>’ ’ then a[i]:=a[i]+ch
else if a[i]<>’’ then i:=i+1;
end;
ans:=0;
for i:=1 to n do
begin
read(j);
ans:=ans+j;
end;
readln(m);
i:=1;
j:=1;
while j<=m do
begin
readln(st);
if save(copy(st,1,pos(’->’,st)-1),copy(st,pos(’->’,st)+2,length(st))) then i:=i-1;
i:=i+1;
j:=j+1;
end;
m:=i-1;
new(pp);
new(qq);
qq^.data:=a[1];
qq^.next:=nil;
qq^.wz:=1;
pp:=qq;
head:=pp;
i:=1;
while i<n do
begin
i:=i+1;
new(qq);
qq^.data:=a[i];
qq^.next:=nil;
qq^.wz:=i;
pp^.next:=qq;
pp:=qq;
end;
writeln(ans+digit(head));
end.
是输入数据读错吗,还是动归错误?请大牛指教。
save、save2、check是读入转换方式。
其中check是检查当前方式中有没有出现没有的元素。。有则删除此方式(因为不可能用到此方式)
give是赋值(在转换方式表里寻找能量转变值,若没有则输出0)
digit是递归过程(类似动归),
但评测器说我只对2个点,另有4个超时、4个错误答案,为什么啊啊,请大牛赐教(*^__^*)