http://icpc.upc.edu.cn/problem.php?cid=1680&pid=3
#include<cstdio>
#include<iostream>
#include<stack>
#define p 10007
using namespace std;
stack<char>s;
int n,i,f[100005],v[100005],t,k;
char c[100005],a[200005];
int main()
{
scanf("%d",&n);
getchar();
for(i=1; i<=n; i++)
scanf("%c",&c[i]);
a[++k]='.';
for(i=1; i<=n; i++)
{
if(c[i]=='('||c[i]=='*')
s.push(c[i]);
if(c[i]=='+')
{
while(s.size()&&s.top()=='*')
{
a[++k]=s.top();
s.pop();
}
s.push(c[i]);
}
if(c[i]==')')
{
while(s.size()&&s.top()!='(')
{
a[++k]=s.top();
s.pop();
}
s.pop();
}
if(c[i]!='('&&c[i]!=')')
a[++k]='.';
}
while(s.size())
{
a[++k]=s.top();
s.pop();
}
for(i=1; i<=k; i++)
{
if(a[i]=='.')
{
f[++t]=1;
v[t]=1;
}
if(a[i]=='*')
{
t--;
f[t]=(f[t+1]*v[t]+f[t]*v[t+1]+f[t]*f[t+1])%p;
v[t]=v[t]*v[t+1]%p;
}
if(a[i]=='+')
{
t--;
v[t]=(f[t+1]*v[t]+f[t]*v[t+1]+v[t]*v[t+1])%p;
f[t]=f[t]*f[t+1]%p;
}
}
printf("%d\n",f[1]);
}