题解 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;
}
望管理大大通过