比赛 20191211 评测结果 AAAAAAAAAA
题目名称 表达式的值 最终得分 100
用户昵称 乐未殇 运行时间 0.058 s
代码语言 C++ 内存使用 13.95 MiB
提交时间 2019-12-11 20:57:22
显示代码纯文本
#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#define mp make_pair
using namespace std;
const int mxn=300005;
const int mod=10007;
stack<char> mul;
stack< pair<int,int> > num; //答案为0/1的种类数 
char s[mxn],ch;
inline void calc(bool flag)   //flag=1是乘法,flag=0是除法 ,递推求得 
{
    mul.pop();
    pair<int,int>n1=num.top();num.pop();
    pair<int,int>n2=num.top();num.pop();
    pair<int,int>ans;
    if(flag)ans=mp(n1.first*n2.first+n1.first*n2.second+n1.second*n2.first,n1.second*n2.second);
    else ans=mp(n1.first*n2.first,n1.first*n2.second+n1.second*n2.first+n1.second*n2.second);
    ans.first%=mod,ans.second%=mod; 
    num.push(ans);
}
int main()
{
	freopen("exp.in","r",stdin);
	freopen("exp.out","w",stdout);
    int i,j,n,cnt=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)//输入并插入要填数字的位置(用1表示) 
    {
        ch=getchar();
        if(ch=='\n' || ch=='\r' || ch==' ') {i--;continue;}
        if((ch=='+' || ch=='*') && s[cnt]!=')') s[++cnt]='1';
        else if(ch==')' && (s[cnt]=='+' || s[cnt]=='*')) s[++cnt]='1';
        s[++cnt]=ch;
    }
    if(s[cnt]=='+' || s[cnt]=='*') s[++cnt]='1';
    for(i=1;i<=cnt;i++)
    {
        if(s[i]=='1'){num.push(mp(1,1));continue;}
        if(mul.empty() || s[i]=='(') {mul.push(s[i]);continue;}
        if(s[i]==')')
        {
            while(mul.top()!='(')
            {
                char tmp=mul.top();
                if(tmp=='*') calc(1);
                else if(tmp=='+') calc(0);
            }
            mul.pop();
            continue;
        }
        if(s[i]=='+')
        {
            while(!mul.empty() && mul.top()=='*')
              calc(1);
            mul.push('+');
            continue;
        }
        if(s[i]=='*')mul.push('*');
    }
    while(!mul.empty())
    {
        char tmp=mul.top();
        if(tmp=='*') calc(1);
        else calc(0);
    }
    printf("%d\n",num.top().first);
    return 0;
}