比赛 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);
}