比赛 |
20121109 |
评测结果 |
WWWWAWAWWT |
题目名称 |
表达式的值 |
最终得分 |
20 |
用户昵称 |
Truth.Cirno |
运行时间 |
1.146 s |
代码语言 |
C++ |
内存使用 |
4.04 MiB |
提交时间 |
2012-11-09 10:35:17 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
using namespace std;
int len,moder=10007,f[2][100010];
string str;
queue<char> ans;
void work(int l,int r)
{
int poi,i,c,top=-1;
char sta[2];
for (poi=l;poi<=r;poi++)
{
if (str[poi]=='(')
{
c=1;
for (i=poi+1;i<=r;i++)
{
if (str[i]=='(')
{
c++;
}
else if (str[i]==')')
{
c--;
if (c==0)
break;
}
}
work(poi+1,i-1);
poi=i;
}
else
{
if (top==-1)
{
top++;
sta[top]=str[poi];
}
else
{
if (str[poi]=='*'&&sta[top]=='*')
{
ans.push('*');
}
else if (str[poi]=='*'&&sta[top]=='+')
{
top++;
sta[top]='*';
}
else if (str[poi]=='+'&&sta[top]=='*')
{
while (top!=-1)
{
ans.push(sta[top]);
top--;
}
top++;
sta[top]='+';
}
else// if (str[poi]=='+'&&sta[top]=='+')
{
ans.push('+');
}
}
}
}
while (top!=-1)
{
ans.push(sta[top]);
top--;
}
}
int main(void)
{
freopen("exp.in","r",stdin);
freopen("exp.out","w",stdout);
int i;
cin>>len;
cin>>str;
work(0,len-1);
i=0;
if (!ans.empty())
{
i++;
if (ans.front()=='+')
{
f[0][i]=1;
f[1][i]=3;
}
else// if (ans.top()=='*')
{
f[0][i]=3;
f[1][i]=1;
}
ans.pop();
}
while (!ans.empty())
{
i++;
if (ans.front()=='+')
{
f[0][i]=f[0][i-1];
f[1][i]=f[0][i-1]+f[1][i-1]*2;
f[0][i]%=moder;
f[1][i]%=moder;
}
else// if (ans.top()=='*')
{
f[0][i]=f[0][i-1]*2+f[1][i-1];
f[1][i]=f[1][i-1];
f[0][i]%=moder;
f[1][i]%=moder;
}
ans.pop();
}
cout<<f[0][i]<<endl;
return(0);
}