【NOIP2011PJ】表达式的值

暴力弄一弄(搞一搞)就可以了哦~

var
        zf:array[1..100000] of char;
        c0,c1:array[0..100000] of int64;
        s:ansistring;
        n,i,j,ss:longint;
begin
        //assign(input,'ccc.in');reset(input);
        //assign(output,'ccc.out');rewrite(output);
        readln(n);
        readln(s);
        s:='('+s+')';
        ss:=1;
        c0[ss]:=1;
        c1[ss]:=1;
        for i:=1 to length(s) do
        begin
                {for j:=1 to ss-1 do
                        write(zf[j]);
                writeln;
                for j:=1 to ss do
                        write(c0[j],' ');
                writeln;
                for j:=1 to ss do
                        write(c1[j],' ');
                writeln;
                writeln;}
                if (s[i]='*')and(s[i+1]<>'(') then
                begin
                        inc(ss);
                        c0[ss]:=1;
                        c1[ss]:=1;
                        c0[ss]:=(c0[ss-1]*c0[ss]+c0[ss-1]*c1[ss]+c0[ss]*c1[ss-1]) mod 10007;
                        c1[ss]:=(c1[ss-1]*c1[ss]) mod 10007;
                        c0[ss-1]:=c0[ss];
                        c1[ss-1]:=c1[ss];
                        dec(ss);
                end else if (s[i]='+')or(s[i]='(')or(s[i]='*') then
                begin
                        inc(ss);
                        c0[ss]:=1;
                        c1[ss]:=1;
                        zf[ss-1]:=s[i];
                end else if s[i]=')' then
                begin
                        while zf[ss-1]<>'(' do
                        begin
                                c1[ss]:=(c1[ss-1]*c1[ss]+c1[ss-1]*c0[ss]+c1[ss]*c0[ss-1]) mod 10007;
                                c0[ss]:=(c0[ss]*c0[ss-1]) mod 10007;
                                c1[ss-1]:=c1[ss];
                                c0[ss-1]:=c0[ss];
                                dec(ss);
                        end;
                        c1[ss-1]:=c1[ss];
                        c0[ss-1]:=c0[ss];
                        ss:=ss-1;
                        if zf[ss-1]='*' then
                        begin
                                c0[ss]:=(c0[ss-1]*c0[ss]+c0[ss-1]*c1[ss]+c0[ss]*c1[ss-1]) mod 10007;
                                c1[ss]:=(c1[ss-1]*c1[ss]) mod 10007;
                                c0[ss-1]:=c0[ss];
                                c1[ss-1]:=c1[ss];
                                dec(ss);
                        end;
                end;
        end;
        writeln(c0[1] mod 10007);
        //close(input);
        //close(output);
end.
转载需注明出处。
原文地址:https://www.cnblogs.com/jz929/p/11817732.html