记录编号 324472 评测结果 AAAAAAAAAA
题目名称 [NOIP 2011]表达式的值 最终得分 100
用户昵称 Gravatar农场主 是否通过 通过
代码语言 C++ 运行时间 0.027 s
提交时间 2016-10-18 09:46:35 内存使用 2.85 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<stack>
#include<cstring>
#define mod 10007
#define maxn 1000000
using namespace std;
char ch[maxn],s[maxn],p[maxn];
int m=0;
class poi{
public:
	int a0,a1;
	poi(){
		a0=1;
		a1=1;
	}
	poi operator + (const poi p)const{
		poi t;
		t.a0=(p.a0*a0)%mod;
		t.a1=(p.a1*a1+p.a1*a0+p.a0*a1)%mod;
		return t;
	}
	poi operator * (const poi p)const{
		poi t;
		t.a0=(p.a0*a0+p.a1*a0+p.a0*a1)%mod;
		t.a1=(p.a1*a1)%mod;
		return t;
	}
};
int main(){
	freopen("exp.in","r",stdin);
	freopen("exp.out","w",stdout);
	int n;
	scanf("%d",&n);
	scanf("%s",ch);
	ch[n]='=';
	int tot=0;
	for (int i=0;i<=n;i++){
		if (ch[i]=='('||s[tot-1]==')');
		else s[tot++]='_';
		s[tot++]=ch[i];
	}
	stack<char> mark;
	stack<poi> st;
	for (int i=0;i<=tot;i++){
		switch(s[i]){
			case '_':{
				p[m++]='_';
				continue;
			}
			case '(':{
				mark.push('(');
				continue;
			}
			case '*':{
				mark.push('*');
				continue;
			}
			case '+':{
				while(!mark.empty()){
					char t=mark.top();
					if (t=='(') break;
					p[m++]=t;
					mark.pop();
				}
				mark.push('+');
				continue;
			}
			case ')':{
				while(!mark.empty()){
					char t=mark.top();
					if (t=='('){
						mark.pop();
						break;
					}
					p[m++]=t;
					mark.pop();
				}
				continue;
			}
			case '=':{
				while(!mark.empty()){
					char t=mark.top();
					if (t=='(') {
						mark.pop();
						continue;
					}
					p[m++]=t;
					mark.pop();
				}
				continue;
			}
		}
	}
	for (int i=0;i<m;i++){
//		printf("%c",p[i]);
		switch(p[i]){
			case '_':{
//				num.push(p[i]);
				poi t;
				st.push(t);
				continue;
			}
			case '+':{
				poi t=st.top();
				st.pop();
				t=t+st.top();
				st.pop();
				st.push(t);
				continue;
			}
			case '*':{
				poi t=st.top();
				st.pop();
				t=t*st.top();
				st.pop();
				st.push(t);
				continue;
			}
		}
	}
	printf("%d",st.top().a0);
//	for () 
	return 0;
}