暴力弄一弄(搞一搞)就可以了哦~
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.