ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 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(+)
Послано Revenger and NSC 7 янв 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! (+)
Послано Revenger and NSC 7 янв 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 (+)
Послано shitty.Mishka 7 янв 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.
Послано Revenger and NSC 8 янв 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!