题解 P1054 【等价表达式】

· · 题解

不能用gets()

不能用gets()

不能用gets()

重要的事情说三遍、、、

被坑了好几次,下回做题时一定要注意一些可能会错的地方仔细审题。

上代码——

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const long long mod=1e11+7;
const int mxn=10010;
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
    string s1,s2;
    char st[mxn];int top=0;
    long long num[mxn];int ntop=0;
    int cmp(char ch){
    if(!top || st[top]=='(') return 0;
    if(st[top]=='^') return 1;
    if(ch=='^') return 0;
    if(st[top]=='*') return 1;
    if(ch=='*') return 0;
    return 1;
}
 int pp(){
     switch(st[top]){
        case '(':{
            top--;
            return 1;
            break;
        }
        case '+':{
            long long n1=num[ntop--];
            long long n2=num[ntop--];
            num[++ntop]=n1+n2;
            break;
        }
        case '-':{
            long long n1=num[ntop--];
            long long n2=num[ntop--];
            num[++ntop]=n2-n1;
            break;
        }
        case '*':{
            long long n1=num[ntop--];
            long long n2=num[ntop--];
            num[++ntop]=n2*n1;
            break;
        }
        case '^':{
            long long n1=num[ntop--];
            long long n2=num[ntop--];
            long long bas=1;
            for(int j=1;j<=n1;j++)bas=(bas*n2);
            num[++ntop]=bas;
            break;
        }
    }
    top--;
    return 0;
}
long long clc(string s,int tp){
    top=ntop=0;
    memset(num,0,sizeof num);
    memset(st,0,sizeof st);
    int len=s.length();
    int i,j;
    for(i=0;i<len;i++){
        if(s[i]==' ')continue;
        if(s[i]=='('){
            st[++top]='(';
            continue;
        }
        if(s[i]=='a'){
            num[++ntop]=tp;
            continue;
        }
        if(s[i]>='0' && s[i]<='9')
        {
            int x=0;
            while(s[i]>='0' && s[i]<='9'){
                x=x*10+s[i]-'0';
                i++;
            }
            i--;
            num[++ntop]=x;
            continue;
        }
        if(s[i]==')'){
            if(top==1 && i!=len-1)i++;
            while(1){if(pp())break;}
            continue;
        }
        while(cmp(s[i]))pp();
        st[++top]=s[i];
    }

    while(top>0){pp();}
    return num[1];
}
int n;
int main(){
    int i,j;
    getline(cin,s1);
    s1='('+s1+')';  
    scanf("%d",&n);
    getline(cin,s2); 
    for(i=0;i<n;++i){
        getline(cin,s2);
        s2='('+s2+')';
        bool flag=1;
        for(j=5;j<=11;j++){
            if(clc(s1,j*7+3)!=clc(s2,j*7+3)){
                flag=0;
                break;
            }
        }
        if(flag)printf("%c",i+'A');
    }
    return 0;
}

望管理大大通过