NOIP 2005 等价表达式 题解

题意

给一个表达式然后再给n个表达式,判断是否等价

一道大模拟题,将a带为数,并且取模防止溢出

#include<bits/stdc++.h>
using namespace std;
const int mod=10007;
char w[55],c[55];
int a[100],t1,t2,x,n;
long long ans[5],c1[55],c2[55],c3[55];
int power(int x,int y){
    int tmp=1;
    while(y){
        if(y&1) tmp=(tmp*x)%mod;
        x=(x*x)%mod;
        y>>=1;
    }
    return tmp%mod;
}
void clu(){
    int m1=c1[t2],n1=c1[t2-1],m2=c2[t2],n2=c2[t2-1],m3=c3[t2],n3=c3[--t2]; 
    switch(w[t1--]){
        case '+':c1[t2]=(n1+m1+mod)%mod; c2[t2]=(n2+m2+mod)%mod; c3[t2]=(n3+m3+mod)%mod; break;
        case '-':c1[t2]=(n1-m1+mod)%mod; c2[t2]=(n2-m2+mod)%mod; c3[t2]=(n3-m3+mod)%mod; break;
        case '*':c1[t2]=(n1*m1+mod)%mod; c2[t2]=(n2*m2+mod)%mod; c3[t2]=(n3*m3+mod)%mod; break;
        case '^':c1[t2]=power(n1,m1); c2[t2]=power(n2,m2); c3[t2]=power(n3,m3); break;
    }
}
void js(){
    x=0;
    for(int i=0;i<strlen(c);i++){
        if(c[i]=='a') {c1[++t2]=3;c2[t2]=7;c3[t2]=13;} 
        else if(isdigit(c[i])) x=x*10+c[i]-'0';
        else{
            if(x!=0){c1[++t2]=x;c2[t2]=x;c3[t2]=x;x=0;}
            if(a[c[i]]==0)continue;
            if(c[i]=='('||t1==0&&c[i]!=')') w[++t1]=c[i]; 
            else{ 
                if(a[c[i]]<a[w[t1]]){
                    if(c[i]!=')') w[++t1]=c[i]; 
                    else{ 
                        while(w[t1]!='('&&t1) clu();   
                        if(w[t1]=='(')t1--;
                    }
                }  
                else{
                    while(a[c[i]]>=a[w[t1]]&&t1) clu(); 
                    if(c[i]!=')') w[++t1]=c[i];
                }
            } 
        }
    }
    if(x!=0){c1[++t2]=x;c2[t2]=x;c3[t2]=x;x=0;}
    while (t1)clu();
}
int main(){
    a['(']=5;a[')']=1;a['^']=2;a['*']=a['/']=3;a['+']=a['-']=4;
    gets(c);
    scanf("%d",&n);
    js();
    gets(c);
    ans[1]=c1[1];ans[2]=c2[1];ans[3]=c3[1];
    for(int i=1;i<=n;++i){
        t1=t2=0;gets(c);js(); 
        if(ans[1]==c1[1]%mod&&ans[2]==c2[1]%mod&&ans[3]==c3[1]%mod) 
        printf("%c",i+64);
    }
    return 0;
} 

转载于:https://www.cnblogs.com/donkey2603089141/p/11416639.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值