记录编号 324544 评测结果 AAAAAAAAAA
题目名称 [NOIP 2011]表达式的值 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 0.064 s
提交时间 2016-10-18 13:28:50 内存使用 0.79 MiB
显示代码纯文本
#include<cstdio>
#include<stack>
#define file(x) "exp."#x
const int LEN=3e5+10,M=10007;
char s[LEN],s2[LEN];
int n,sz;
struct NODE{int a[2];NODE(int x,int y){a[0]=x,a[1]=y;}};
std::stack<NODE> st;
NODE gtop(){
	if(st.empty()) return NODE(1,1);
	else {
		NODE t=st.top();
		st.pop();
		return t;
	}
}
void toattr(){
	std::stack<char> st;
	for(int i=1;i<=n;i++){
		switch(s[i]){
			case '+':
				while(!st.empty()&&st.top()!='('){
					s2[++sz]=st.top();
					st.pop();
				}
				st.push(s[i]);
				break;
			case '*':
				while(!st.empty()&&st.top()!='('&&st.top()=='*'){
					s2[++sz]=st.top();
					st.pop();
				}
				st.push(s[i]);
				break;
			case ')':
				while(!st.empty()&&st.top()!='('){
					s2[++sz]=st.top();
					st.pop();
				}
				if(!st.empty()&&st.top()=='(') st.pop();
				break;
			case '(':st.push(s[i]);break;
			case '_':s2[++sz]='_';break;
		}
	}
	while(!st.empty()) s2[++sz]=st.top(),st.pop();
}
int main(){
	freopen(file(in),"r",stdin);
	freopen(file(out),"w",stdout);
	scanf("%d",&n);
	getchar();
	for(int i=1;i<=n;i++){
		char ch;
		scanf("%c",&ch);
		if(ch=='*'||ch=='+'){
			if(!sz||(s[sz]!=')'&&s[sz]!='_')) s[++sz]='_';
		}
		else if(ch==')'&&(s[sz]=='*'||s[sz]=='+')) s[++sz]='_';
		s[++sz]=ch;
	}
	if(s[sz]=='+'||s[sz]=='*') s[++sz]='_';
	n=sz;
	sz=0;
	toattr();
	//printf("%s",s2+1);
	for(int i=1;i<=sz;i++) {
		if(s2[i]=='+'){
			NODE x=gtop(),y=gtop();
			int o=x.a[1]*y.a[1]%M+x.a[1]*y.a[0]%M+x.a[0]*y.a[1]%M;
			int z=x.a[0]*y.a[0]%M;
			st.push(NODE(z%M,o%M));
		}
		else if(s2[i]=='*'){
			NODE x=gtop(),y=gtop();
			int o=x.a[1]*y.a[1]%M;
			int z=x.a[0]*y.a[0]%M+x.a[1]*y.a[0]%M+x.a[0]*y.a[1]%M;
			st.push(NODE(z%M,o%M));
		}
		else st.push(NODE(1,1));
	}
	NODE u=gtop();
	printf("%d",u.a[0]);
}