讨论 / 我只用了hash为什么错4个点
deter 2011-08-26 07:21:00
点我顶贴 收藏 删除
没用hash时只错5,10点,加了hash后错4,5,9,10点,为什么

这是程序

const

maxn=799999;

var

n:longint;

c:array[0..maxn]of longint;

h,d:array[0..maxn]of string;

a,b:array[0..50]of string;

s1,s2:string;

procedure init;

var

i:longint;

begin

readln(s1);

i:=pos(' ',s1);

s2:=copy(s1,i+1,length(s1)-i);

delete(s1,i,length(s1)-i+1);

while not eof do

begin

inc(n);

readln(a[n]);

i:=pos(' ',a[n]);

b[n]:=copy(a[n],i+1,length(a[n])-i);

delete(a[n],i,length(a[n])-i+1);

end;

end;

function hash(s:string):boolean;

var

i,j,x:longint;

begin

x:=0;

for i:=1 to length(s) do

x:=x+(ord(s[i])-i)*i;

x:=x mod maxn;

while (h[x]<>'')and(h[x]<>s) do

x:=x mod maxn+1;

if h[x]='' then begin

h[x]:=s;

exit(true);

end

else exit(false);

end;

procedure bfs;

var

pp:boolean;

ss,s:string;

head,tail,i,j:longint;

begin

head:=0;

tail:=1;

d[1]:=s1;

pp:=hash(s1);

repeat

head:=head mod maxn+1;

for i:=1 to n do

begin

j:=pos(a[i],d[head]);

if j>0 then begin

ss:=copy(d[head],1,j-1);

ss:=ss+b[i];

s:=copy(d[head],j+length(a[i]),length(d[head])-j-length(a[i])+1);

ss:=ss+s;

if hash(ss) then begin

tail:=tail mod maxn+1;

d[tail]:=ss;

c[tail]:=c[head]+1;

if d[tail]=s2 then begin

writeln(c[tail]);

halt;

end;

end;

end;

end;

until (head>=tail)or(c[tail]>=10);

writeln('NO ANSWER!');

end;

begin

init;

bfs;

end.

查看更多回复
提交回复