ENG  RUSTimus Online Judge
Online Judge
Problems
Authors
Online contests
About Online Judge
Frequently asked questions
Site news
Webboard
Links
Problem set
Submit solution
Judge status
Guide
Register
Update your info
Authors ranklist
Current contest
Scheduled contests
Past contests
Rules
back to board

Discussion of Problem 1165. Subnumber

What can be wrong with my program. When I use Turbo Pascal I get rigth answer, but if I use Delphi i get wrong(+)
Posted by Revenger and NSC 7 Jan 2002 16:04
This test:

01102103

My code:

Program t1165;

Const MaxD=400;

Type  ResType=array[1..MaxD]of integer;

Var A       :string[250];
    Min,Cur :string[250];
    i,mfrom :integer;
    GetOk   :boolean;
    wor     :array[1..251]of integer;

Procedure MakeWor(S:string);
Var i,j,p :integer;
 begin
  FillChar(wor,SizeOf(wor),0);
  for i:=length(S) downto 1 do begin
   val(S[i],j,p);
   wor[length(S)-i+1]:=j;
  end;
 end;

Function ConvertInStr(len:integer):string;
var i     :integer;
    l,ans :string[250];
 begin
  ans:='';
  for i:=1 to len do begin
   str(wor[i],l);
   ans:=l+ans;
  end;
  ConvertInStr:=ans;
 end;

Function GetPred(S:string):string;
var i,j,flag :integer;
 begin
  flag:=0;
  MakeWor(S);
  wor[1]:=wor[1]-1;
  if wor[1]=-1 then begin
   for j:=2 to 251 do
    if wor[j]>0 then break;
   wor[j]:=wor[j]-1;
   if wor[j]=0 then flag:=-1;
   for i:=1 to j-1 do wor[i]:=9;
  end;
  GetPred:=ConvertInStr(length(S)+flag);
 end;

Function GetNext(S:string):string;
var i,j,flag :integer;
 begin
  flag:=0;
  MakeWor(S);
  wor[1]:=wor[1]+1;
  for i:=1 to 251 do
   if wor[i]>9 then begin
    wor[i+1]:=wor[i+1]+(wor[i] div 10);
    wor[i]:=wor[i] mod 10;
   end;
  if wor[length(S)+1]>0 then flag:=1;
  GetNext:=ConvertInStr(length(S)+flag);
 end;

Function GetNextXX(StrX:string):string;
Var i,j,p :integer;
    ans,l :string[250];
    mas   :array[1..251]of byte;
 begin
  FillChar(mas,SizeOf(mas),0);
  for i:=length(StrX) downto 1 do begin
   val(StrX[i],j,p);
   mas[length(StrX)-i+1]:=j;
  end;
  ans:='';
  mas[1]:=mas[1]+1;
  for i:=1 to 251 do
   if mas[i]>9 then begin
    mas[i+1]:=mas[i+1]+(mas[i] div 10);
    mas[i]:=mas[i] mod 10;
   end;
  for i:=1 to length(StrX) do begin
   str(mas[i],l);
   ans:=l+ans;
  end;
  GetNextXX:=ans;
 end;

Function GetMin(from:integer):string;
Var BeginStr   :string[250];
    MaskStr    :string[250];
    second     :string[250];
    Next       :string[250];
    CurPos     :integer;
    MaskBegin  :integer;
    i,j,t      :integer;
    len        :integer;
    ok,yes     :boolean;
 begin
  BeginStr:=copy(A,1,from);
  MaskStr:=GetNextXX(BeginStr);
  MaskBegin:=from+1;
  if A[MaskBegin]='0' then begin
   GetOk:=false;
   exit;
  end;
  if MaskStr<BeginStr then
   MaskBegin:=MaskBegin+1;
  len:=length(MaskStr);
  for i:=MaskBegin-1 to length(A) do begin
   ok:=true;
   for j:=1 to len do begin
    if i+j>length(A) then break;
    if A[i+j]<>MaskStr[j] then ok:=false;
   end;
   if ok then begin
    yes:=true;
    second:=copy(A,from+1,i+j-from);
    if i+j>length(A) then
     for t:=j to len do second:=second+MaskStr[t];
    CurPos:=i+j+1;
    if Pos(BeginStr,GetPred(second))=0 then yes:=false;
    Next:=second;
    While True do begin
     Next:=GetNext(Next);
     for t:=CurPos to CurPos+length(Next)-1 do begin
      if t>length(A) then break;
      if A[t]<>Next[t-CurPos+1] then yes:=false;
     end;
     CurPos:=CurPos+length(Next);
     if CurPos>length(A) then break;
    end;
    if yes then begin
     GetOk:=true;
     GetMin:=GetPred(second);
     exit;
    end;
   end;
  end;
  GetOk:=false;
 end;

Procedure MakeResult;
Var i,j,k   :integer;
    um,l    :integer;
    A,B,C,S :ResType;
 begin
  FillChar(A,SizeOf(A),0);
  for i:=1 to length(Min) do begin
   val(Min[i],k,j);
   A[length(Min)+1-i]:=k;
  end;
  FillChar(S,SizeOf(S),0);
  for i:=1 to length(Min)-1 do begin
   FillChar(B,SizeOf(B),0);
   B[i]:=9;
   FillChar(C,SizeOf(C),0);
   um:=0;
   for j:=1 to MaxD do begin
     l:=b[j]*i+um;
     c[j]:=l mod 10;
     um:=l div 10;
    end;
   um:=0;
   for j:=1 to MaxD do begin
     l:=c[j]+s[j]+um;
     s[j]:=l mod 10;
     um:=l div 10;
    end;
  end;
  B:=A;
  B[length(Min)]:=B[length(Min)]-1;
   FillChar(C,SizeOf(C),0
Re: I've found the error. But I still get WA. Please help me! (+)
Posted by Revenger and NSC 7 Jan 2002 16:22
My new program:

Program t1165;

Const MaxD=400;

Type  ResType=array[1..MaxD]of integer;

Var A        :string[250];
    MinS,Cur :string[250];
    i,mfrom  :integer;
    GetOk    :boolean;
    wor      :array[1..251]of integer;

Procedure MakeWor(S:string);
Var i,j,p :integer;
 begin
  FillChar(wor,SizeOf(wor),0);
  for i:=length(S) downto 1 do begin
   val(S[i],j,p);
   wor[length(S)-i+1]:=j;
  end;
 end;

Function ConvertInStr(len:integer):string;
var i     :integer;
    l,ans :string[250];
 begin
  ans:='';
  for i:=1 to len do begin
   str(wor[i],l);
   ans:=l+ans;
  end;
  ConvertInStr:=ans;
 end;

Function GetPred(S:string):string;
var i,j,flag :integer;
 begin
  flag:=0;
  MakeWor(S);
  wor[1]:=wor[1]-1;
  if wor[1]=-1 then begin
   for j:=2 to 251 do
    if wor[j]>0 then break;
   wor[j]:=wor[j]-1;
   if wor[j]=0 then flag:=-1;
   for i:=1 to j-1 do wor[i]:=9;
  end;
  GetPred:=ConvertInStr(length(S)+flag);
 end;

Function GetNext(S:string):string;
var i,j,flag :integer;
 begin
  flag:=0;
  MakeWor(S);
  wor[1]:=wor[1]+1;
  for i:=1 to 251 do
   if wor[i]>9 then begin
    wor[i+1]:=wor[i+1]+(wor[i] div 10);
    wor[i]:=wor[i] mod 10;
   end;
  if wor[length(S)+1]>0 then flag:=1;
  GetNext:=ConvertInStr(length(S)+flag);
 end;

Function GetNextXX(StrX:string):string;
Var i,j,p :integer;
    ans,l :string[250];
    mas   :array[1..251]of byte;
 begin
  FillChar(mas,SizeOf(mas),0);
  for i:=length(StrX) downto 1 do begin
   val(StrX[i],j,p);
   mas[length(StrX)-i+1]:=j;
  end;
  ans:='';
  mas[1]:=mas[1]+1;
  for i:=1 to 251 do
   if mas[i]>9 then begin
    mas[i+1]:=mas[i+1]+(mas[i] div 10);
    mas[i]:=mas[i] mod 10;
   end;
  for i:=1 to length(StrX) do begin
   str(mas[i],l);
   ans:=l+ans;
  end;
  GetNextXX:=ans;
 end;

Function GetMin(from:integer):string;
Var BeginStr   :string[250];
    MaskStr    :string[250];
    second     :string[250];
    Next       :string[250];
    CurPos     :integer;
    MaskBegin  :integer;
    i,j,t      :integer;
    len        :integer;
    ok,yes     :boolean;
 begin
  BeginStr:=copy(A,1,from);
  MaskStr:=GetNextXX(BeginStr);
  MaskBegin:=from+1;
  if A[MaskBegin]='0' then begin
   GetOk:=false;
   exit;
  end;
  if MaskStr<BeginStr then
   MaskBegin:=MaskBegin+1;
  len:=length(MaskStr);
  for i:=MaskBegin-1 to length(A) do begin
   ok:=true;
   for j:=1 to len do begin
    if i+j>length(A) then break;
    if A[i+j]<>MaskStr[j] then ok:=false;
   end;
   if ok then begin
    yes:=true;
    second:=copy(A,from+1,i+len-from);
    if i+j>length(A) then
     for t:=j to len do second:=second+MaskStr[t];
    CurPos:=i+len+1;
    if Pos(BeginStr,GetPred(second))=0 then yes:=false;
    Next:=second;
    While True do begin
     Next:=GetNext(Next);
     for t:=CurPos to CurPos+length(Next)-1 do begin
      if t>length(A) then break;
      if A[t]<>Next[t-CurPos+1] then yes:=false;
     end;
     CurPos:=CurPos+length(Next);
     if CurPos>length(A) then break;
    end;
    if yes then begin
     GetOk:=true;
     GetMin:=GetPred(second);
     exit;
    end;
   end;
  end;
  GetOk:=false;
 end;

Procedure MakeResult;
Var i,j,k   :integer;
    um,l    :integer;
    A,B,C,S :ResType;
 begin
  FillChar(A,SizeOf(A),0);
  for i:=1 to length(MinS) do begin
   val(MinS[i],k,j);
   A[length(MinS)+1-i]:=k;
  end;
  FillChar(S,SizeOf(S),0);
  for i:=1 to length(MinS)-1 do begin
   FillChar(B,SizeOf(B),0);
   B[i]:=9;
   FillChar(C,SizeOf(C),0);
   um:=0;
   for j:=1 to MaxD do begin
     l:=b[j]*i+um;
     c[j]:=l mod 10;
     um:=l div 10;
    end;
   um:=0;
   for j:=1 to MaxD do begin
     l:=c[j]+s[j]+um;
     s[j]:=l mod 10;
     um:=l div 10;
    end;
  end;
  B:=A;
  B[length(MinS)]:=B[length(MinS)]-1;
   FillChar(C,SizeOf(C),0);
A test for you (+)
Posted by shitty.Mishka 7 Jan 2002 23:58
Try this test case : 09910
The correct answer is 2618 (909,910)
By the way, this is the test that xyz gave me when I asked for some
help on this problem. It is often useful to watch webboard for the
problem you can't get AC for - if you did this you would find this
test case.
Hope you'll get AC!
Good luck!
Re: Thank you! But I've got AC already.
Posted by Revenger and NSC 8 Jan 2002 12:08
> Try this test case : 09910
> The correct answer is 2618 (909,910)
> By the way, this is the test that xyz gave me when I asked for some
> help on this problem. It is often useful to watch webboard for the
> problem you can't get AC for - if you did this you would find this
> test case.
> Hope you'll get AC!
> Good luck!