#include<bits/stdc++.h>
using namespace std;
namespace akak
{
int Num[100010][4],Z[100010];
char S[100010];
int mod=10007;
int w=0,nw=0;
void c()
{
int b=Num[nw][1]*Num[nw-1][1];
int a=Num[nw][0]*(Num[nw-1][1])%mod+Num[nw-1][0]*(Num[nw][1])%mod+Num[nw-1][0]*(Num[nw][0]);
nw--;
Num[nw][0]=a%mod;
Num[nw][1]=b%mod;
}
void j()
{
// cout<<6<<endl;
int a=Num[nw-1][0]*Num[nw][0];
int b=Num[nw][1]*(Num[nw-1][1]+Num[nw-1][0])%mod+Num[nw-1][1]*(Num[nw][0])%mod;
nw--;
Num[nw][0]=a%mod;
Num[nw][1]=b%mod;
}
int main()
{
int n;
scanf("%d",&n);
scanf("%s",S+1);
S[0]='(';
S[n+1]=')';
for(int i=0;i<=n+1;i++)
{
//cout<<i<<endl;
if(S[i]=='(')
{
Z[++w]=1;
if(S[i+1]!='(')Num[++nw][0]=Num[nw][1]=1;
}
else if(S[i]==')')
{
while(Z[w]!=1)
{
//cout<<Num[nw][1]<<endl;
if(Z[w]==2)j();
else c();
// cout<<Num[nw][0]<<endl;
w--;
// cout<<Z[w];
}
w--;
// if(S[i+1]!='(')Num[++nw][0]=Num[nw][1]=1;
}
else if(S[i]=='*')
{
while(Z[w]==3&&w)
{
c();
w--;
}
Z[++w]=3;
if(S[i+1]!='(')Num[++nw][0]=Num[nw][1]=1;
}
else
{
while(Z[w]!=1&&w)
{
if(Z[w]==2)j();
else c();
w--;
}
Z[++w]=2;
if(S[i+1]!='(')Num[++nw][0]=Num[nw][1]=1;
}
// cout<<Z[w]<<endl;
/* for(int i=1;i<=nw;i++)
{
cout<<Num[i][1]<<' ';
}
cout<<endl;*/
}
cout<<Num[1][0];
return 0;
}
}
int main()
{
// freopen("exp.in","r",stdin);
// freopen("exp.out","w",stdout);
akak::main();
return 0;
}
这段代码我在洛谷上0pts,但是下载数据后是对的(其他oj也是)