比赛 防止颓废的小练习v0.15 评测结果 AAAAAAAAAA
题目名称 表达式的值 最终得分 100
用户昵称 Kulliu 运行时间 0.024 s
代码语言 C++ 内存使用 2.29 MiB
提交时间 2016-10-17 21:00:47
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
const int maxn=150010,mod=10007;
char s[maxn*2],t[maxn*2],now[maxn*2],c;
int lenn,lent,len,num,n;
int f[maxn][2];
void jrz()
{
    while(now[lenn]=='+'||now[lenn]=='*')t[++lent]=now[lenn--];
    now[++lenn]='+';
}
void crz()
{
    while(now[lenn]=='*')t[++lent]=now[lenn--];
    now[++lenn]='*';
}
void kcz()
{
    while(now[lenn]!='(')t[++lent]=now[lenn--];
    lenn--;
}
void pluss()
{
    f[num][1]=(f[num][0]*f[num+1][1]+f[num][1]*f[num+1][0]+f[num][1]*f[num+1][1])%mod;
    f[num][0]=(f[num][0]*f[num+1][0])%mod;
}
void cheng()
{
    f[num][0]=(f[num][0]*f[num+1][1]+f[num][1]*f[num+1][0]+f[num][0]*f[num+1][0])%mod;
    f[num][1]=(f[num][1]*f[num+1][1])%mod;
}
void change()
{
    now[0]='(';lenn=0;lent=-1;
    for(int i=0;i<=len;i++)
     {
         if(s[i]=='_')t[++lent]='_';
         if(s[i]=='+')jrz();
         if(s[i]=='*')crz();
         if(s[i]=='(')now[++lenn]='(';
         if(s[i]==')')kcz();
     }
    kcz();
}
void work()
{
    num=0;
    for(int i=0;i<=lent;i++)
     {
         if(t[i]=='_')
          {
              num++;
              f[num][0]=1;f[num][1]=1;
          }
         if(t[i]=='+')num--,pluss();
         if(t[i]=='*')num--,cheng();
     }
}
int main()
{
    freopen("exp.in","r",stdin);
    freopen("exp.out","w",stdout);
    scanf("%d",&n);
    c=getchar();c=getchar();
    len=-1;
    if(c!='(')s[0]='_',len=0;
    s[++len]=c;
    for(int i=2;i<=n;i++)
     {
         c=getchar();
         if(c!='('&&s[len]!=')')s[++len]='_';
         s[++len]=c;
     }
    if(c!=')')s[++len]='_';
    change();
    work();
    printf("%d",f[1][0]);
    return 0;
}