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 1027. D++ Again

Please tell me where have I mistaken! I ve been fighting this problem for almost a week...
Posted by Alex[LSD] 9 Apr 2002 23:25
Thats what the variables mean:
Com-whether the viewed symbol is inside a comment.
j- number of opening brackets reduced by the number of closing
brackets (brackets in comments dont count)
sk-whether the previos symbol was '('
zv-whether the previos symbol was '*'
=-=-==-=-=-=-=-=--=-
Program acm_1027; {D++}
Var A            :array [1..10000] of char;
    i,j,k,l      :integer;
    com,Form,Ans :boolean;
    sk,zv        :boolean;
    c            :char;

Function Bad(x:char):boolean;
var an:boolean;
Begin
  an:=true;
  If x='=' then an:=false;
  If x='+' then an:=false;
  If x='-' then an:=false;
  If x='*' then an:=false;
  If x='/' then an:=false;
  If x='(' then an:=false;
  If x=')' then an:=false;
  If x=#13 then an:=false;
  If x=#10 then an:=false;
  If (x>='0')and(x<='9') then an:=false;
  bad:=an;
End;

Begin
  ans:=true;

  i:=0; c:=' ';
  While (Not Eof) Do
  Begin
    Inc(i);
    Read(A[i]);
  End;
  l:=i;

  j:=0;
  Com:=False; Form:=False; zv:=false; sk:=false;
  For i:=1 to L do
  Begin
    If (A[i]=')') and (not com) then Dec(j);
    If (A[i]=')')and(zv) then com:=false;
    If (A[i]='*')and(sk) then com:=true;
    If (sk) and (not com) then Inc(j);

    If A[i]='*' then zv:=true Else zv:=false;
    If A[i]='(' then sk:=true Else sk:=false;

    If j<0 then ans:=false;
    If (j>0)and(not com)and(Bad(A[i])) then ans:=false;
  End;
  if (j>0)or(com) then ans:=false;
  If Ans then writeln('YES') Else writeln('NO');
End.
Re: Please tell me where have I mistaken! I ve been fighting this problem for almost a week...
Posted by Ivan Georgiev 10 Apr 2002 03:19
Try this test

((*)()()()()()()()()())))))))((((((*)()())

it is correct (YES), but your program returns NO, it thinks that
(*) is opening and closing comment simultaneously;

by the way the test
(*)
is ambiguous - it could be YES, if you consider it as an arithmetical
expression, or it could be NO, if you consider it as an unclosed
comment; my program gives NO (it got AC), yours YES, so I reckon that
(* is with higher priority than (

Good luck.
HELP ! I try it MORE than one week. :(
Posted by Song Chao (ECUST Mutistar) 13 Apr 2002 10:13
What's wrong with my program?
I tried all the testdata such as
(*) ->NO
()  ->YES
(()) ->YES
and yours
((*)()()()()()()()()())))))))((((((*)()()) ->YES

And my program still got WA,I don't why.

Could you help me?

const
  MaxSize=10005;

var
  word:array[1..MaxSize] of char;
  Top,Cur:integer;
  C:char;
  Error:boolean;


procedure comment;
var
  b:boolean;
begin
  b:=true;
  inc(cur);
  while (cur<top) and b do
  begin
    if (word[cur]='*') and (word[Cur+1]=')') then b:=false
     else inc(cur);
  end;
  if not b then inc(cur) else error:=true;
end;

procedure expression;
var
  b:boolean;
  T:integer;
begin
  inc(Cur);
  if (Cur>Top) then begin Error:=true; exit; end;
  //if (word[Cur]=')') then begin error:=true; exit; end;
  if word[Cur]='*' then begin Comment; exit; end;
  b:=false;  T:=1;
  while (Not error) and (Cur<=Top) and (T>0) and
    (word[Cur] in ['+','-','*','/','0'..'9','(',')','=']) do
  begin
    if (word[cur]='(') and (word[cur+1]<>'*') then begin b:=true;
T:=T+1; end;
    if (word[cur]<>'(') and (word[cur]<>')') then b:=true;
    if (word[Cur]=')') then T:=T-1;
    if (word[Cur]='(') and (word[Cur+1]='*') then begin inc(cur);
comment; end;
    if T<>0 then inc(cur);
  end;
  if T<>0 then error:=true;
  //if not b then error:=true;

end;

begin

  Top:=0;
  read(c);
  while not eof do
  begin
    if (ord(c)<>13) and (ord(C)<>10) and (ord(c)<>0) then
    begin
      inc(Top);
      word[top]:=c;
    end;
    read(c);
  end;
  Cur:=1; Error:=false;
  Word[Top+1]:=' ';
  while (Not Error) and (Cur<=Top) do
  begin
    if word[Cur]='(' then Expression
      else
        if word[Cur]=')' then error:=true;
    inc(Cur);
  end;
  if Not error then writeln('YES')
    else writeln('NO');
  end.