hướng dẫn EXPAR – spoj

Nguồn đề bài http://vn.spoj.com/problems/EXPAR/

1. Đề bài EXPAR spoj

Cho biểu thức số học chỉ chứa hai biến x, y, các hằng số và các phép toán +,−,×. Hãy xác định tính chẵn – lẻ của kết quả biểu thức dựa trên tính chẵn – lẻ của hai biến x, y.

Input

Dòng 1: xâu S có độ dài không quá 106 chỉ gồm các kí tự chữ số, chữ cái ′x′,  ′y′ và các dấu  phép toán +,−,∗. Xâu S đảm bảo là biểu thức toán học hợp lệ, các hằng số đều là số nguyên không âm và không có chữ số vô nghĩa.

Dòng 2,3: mỗi dòng ghi xâu ′Odd′ hay ′Even’ chỉ tính lẻ hay chẵn của tương ứng biến x và y.

Output

Ghi xâu ′Odd′ hay ′Even’ là kết quả của bài toán.

Example

Input:
x-y*2

Odd

Odd
Output:
Odd

2. Hướng dẫn EXPAR spoj

sử dụng kí pháp Balan để giải quyết bài toán, bên cạnh đó chuyển những số quá lớn trở thành số nhỏ để dễ dàng lưu trữ hơn. Dù số có lớn đến đâu nhưng tính chẳn lẽ của nó thì vẫn ko thay đổi, vì thế bạn chỉ cần chuyển số chẳn lớn thành số 2 và số lẻ lớn thành số 1 và dùng kí pháp balan là được.

3. Code tham khảo EXPAR spoj

[sociallocker]

const   fi='';
        nmax=1000010;
type    data=longint;
        data1=shortint;
var
        f:text;
        S:ansistring;
        n:data;
        v:array[0..nmax+1] of data1;
        c:array[0..nmax+1] of char;
        ic,iv:data;

procedure docfile;
var     i,dau,r:data;
        c:ansistring;
        k:string;
        tmp:ansistring;
        x,y:char;
begin
        assign(f,fi); reset(f);
        readln(f,c);
        readln(f,k);
        if k='Odd' then
                x:='1'
        else
                x:='2';
        readln(f,k);
        if k='Odd' then
                y:='1'
        else
                y:='2';
        close(f);
        i:=1;
        n:=length(c);
        s:='';
        c:=c+' ';
        while i<=n do
                if c[i] in ['0'..'9'] then
                        begin
                                dau:=i;
                                while c[i+1] in ['0'..'9'] do
                                        inc(i);
                                tmp:=copy(c,dau,i-dau+1);
                                if tmp='0' then
                                        s:=s+'0'
                                else
                                        if (ord(tmp[length(tmp)])-48) mod 2=0 then
                                                s:=s+'2'
                                        else
                                                s:=s+'1';
                                inc(i);
                        end
                else
                        begin
                                s:=s+c[i];
                                inc(i);
                        end;
        n:=length(s);
        for i:=1 to n do
                if s[i]='x' then
                        s[i]:=x
                else
                        if s[i]='y' then
                                s[i]:=y;
end;



procedure themC(ch:char);
begin
        inc(ic);
        C[ic]:=ch;
end;

procedure themv(x:data1);
begin
        inc(iv);
        v[iv]:=x;
end;

function xemc:char;
begin
        exit(c[ic]);
end;

function xemv:data1;
begin
        exit(v[iv]);
end;

function bac(x:char):data;
begin
        if x='*' then
                exit(2)
        else
                if x in ['+','-'] then
                        exit(1);
        exit(0);
end;

function layV:data1;
begin
        layv:=v[iv];
        dec(iv);
end;

procedure layc;
begin
        dec(ic);
end;

procedure tinh(x:char);
var     a,b:data1;
begin
        b:=layv;
        a:=layv;
        case x of
        '+': themv(a+b);
        '-': themv(a-b);
        '*': themv(a*b);
        end;
        if v[iv] <> 0 then
                if v[iv] mod 2=0 then
                        V[iv]:=2
                else
                        v[iv]:=1;
end;


procedure xulitinh(ch:char);
begin
        while bac(ch)<=bac(xemc) do
                begin
                        tinh(xemc);
                        layc;
                end;
        themc(ch);
end;


procedure xuli;
var     i,j:data;
begin
        iv:=0;
        ic:=0;
        for i:=1 to n do
                begin
                        if s[i] in ['0'..'2'] then
                                themV(ord(s[i])-48)
                        else
                                xulitinh(s[i]);
                end;
        while ic<>0 do
                begin
                        tinh(xemc);
                        layc;
                end;
        if v[iv] mod 2 = 0 then
                writeln('Even')
        else
                writeln('Odd');
end;

begin
        docfile;
        xuli;
end.

[/sociallocker]

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *