| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
整个人崩溃掉了!!一直RE是怎么回事啊~求救啊想自杀了。。var
i,j,n,m,k,ans,max,p,t:longint;
a,d,height,tsa,sa,rank,x,y:array[-10..100000]of longint;
sum:array[0..500]of longint;
procedure suffix;
begin
for i:=1 to n do inc(sum[a[i]]);
for i:=1 to 500 do sum[i]:=sum[i-1]+sum[i];
for i:=n downto 1 do
begin
sa[sum[a[i]]]:=i;
dec(sum[a[i]]);
end;
p:=0;
for i:=1 to n do
begin
if a[sa[i]]<>a[sa[i-1]] then inc(p);
rank[sa[i]]:=p;
end;
j:=1;
while p<n do
begin
for i:=1 to n do
begin
x[i]:=rank[i];
y[i]:=rank[i+j];
end;
fillchar(sum,sizeof(sum),0);
for i:=1 to n do inc(sum[y[i]]);
for i:=1 to 500 do sum[i]:=sum[i-1]+sum[i];
for i:=n downto 1 do
begin
tsa[sum[y[i]]]:=i;
dec(sum[y[i]]);
end;
p:=0;
for i:=1 to n do
begin
if y[tsa[i]]<>y[tsa[i-1]] then inc(p);
rank[tsa[i]]:=i;
end;
fillchar(sum,sizeof(sum),0);
for i:=1 to n do inc(sum[x[tsa[i]]]);
for i:=1 to 500 do sum[i]:=sum[i-1]+sum[i];
for i:=n downto 1 do
begin
sa[sum[x[tsa[i]]]]:=tsa[i];
dec(sum[x[tsa[i]]]);
end;
p:=0;
for i:=1 to n do
begin
if (x[sa[i]]<>x[sa[i-1]])or(y[sa[i]]<>y[sa[i-1]]) then inc(p);
rank[sa[i]]:=p;
end;
j:=j shl 1;
end;
end;
function check(k:longint):boolean;
var max,min:longint;
begin
max:=0;
min:=maxlongint;
for i:=2 to n do
begin
if height[i]>=k-1 then
begin
if sa[i]>max then max:=sa[i];
if sa[i]<min then min:=sa[i];
if max-min>=k then exit(true);
end else
begin
max:=sa[i];
min:=sa[i];
end;
end;
exit(false);
end;
procedure work(l,r:longint);
var mid:longint;
begin
if l>r then exit;
mid:=(l+r)shr 1;
if check(mid) then
begin
if mid>ans then ans:=mid;
work(mid+1,r);
end else work(l,mid-1);
end;
procedure Get_Height;
begin
for i:=1 to n do
begin
k:=0;
while (sa[i]+k<=n)and(sa[i-1]+k<=n)and(a[sa[i]+k]=a[sa[i-1]+k]) do inc(k);
height[i]:=k;
end;
end;
procedure init;
begin
readln(n);
while n<>0 do
begin
ans:=0;
fillchar(sum,sizeof(sum),0);
for i:=1 to n do
read(d[i]);
d[0]:=-1;
for i:=1 to n do
a[i]:=d[i]-d[i-1];
for i:=1 to n do a[i]:=a[i]+200;
suffix;
Get_Height;
work(1,n);
writeln(ans);
readln(n);
end;
end;
begin
init;
end.
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator