比赛 |
20121109 |
评测结果 |
EEEEEEEEEE |
题目名称 |
表达式的值 |
最终得分 |
0 |
用户昵称 |
Makazeu |
运行时间 |
0.741 s |
代码语言 |
C++ |
内存使用 |
3.28 MiB |
提交时间 |
2012-11-09 11:59:31 |
显示代码纯文本
/*
* Problem : exp
* Contest : NOIP2011
*/
#include <stack>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MOD=10007;
stack<int> sum[2],op;
string expr;int len;
inline int priorty(char c)
{
return ((c=='+')?1:2);
}
int main()
{
freopen("exp.in","r",stdin);
freopen("exp.out","w",stdout);
cin>>len>>expr;
sum[0].push(1);sum[1].push(1);
int a[2],b[2],t[2],tpr,top;
op.push(999);
for(int i=0;i<=len-1;i++)
{
tpr=priorty(expr[i]);
if(tpr<op.top())
{
op.push(tpr);
sum[0].push(1);
sum[1].push(1);
continue;
}
top=op.top(); op.pop();
a[0]=sum[0].top();sum[0].pop();
b[0]=sum[0].top();sum[0].pop();
a[1]=sum[1].top();sum[1].pop();
b[1]=sum[1].top();sum[1].pop();
if(top==1)
{
t[0]=(a[0]*b[0])%MOD;
t[1]=((a[0]*b[1])%MOD+
(a[1]*b[1])%MOD+
(a[1]*b[0])%MOD)%MOD;
}
if(top==2)
{
t[1]=(a[1]*b[1])%MOD;
t[0]=((a[0]*b[0])%MOD+
(a[0]*b[1])%MOD+
(a[1]*b[0])%MOD)%MOD;
}
sum[0].push(t[0]);
sum[1].push(t[1]);
op.push(tpr);
}
sum[1].push(1); sum[0].push(1);
top=op.top(); op.pop();
a[0]=sum[0].top();sum[0].pop();
b[0]=sum[0].top();sum[0].pop();
a[1]=sum[1].top();sum[1].pop();
b[1]=sum[1].top();sum[1].pop();
if(top==1)
{
t[0]=(a[0]*b[0])%MOD;
t[1]=((a[0]*b[1])%MOD+
(a[1]*b[1])%MOD+
(a[1]*b[0])%MOD)%MOD;
}
if(top==2)
{
t[1]=(a[1]*b[1])%MOD;
t[0]=((a[0]*b[0])%MOD+
(a[0]*b[1])%MOD+
(a[1]*b[0])%MOD)%MOD;
}
sum[0].push(t[0]);
sum[1].push(t[1]);
printf("%d\n",sum[0].top());
return 0;
}