- 等价表达式
- 2017-08-26 09:36:12 @
用的hzwer的代码,事实证明多样检测是无用的,还不如暴力一波。
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#define _S (205)
#define LL long long
using namespace std;
int N, G;
int Op[_S];
LL Num[_S];
LL Pow (LL a, LL b) {
LL ans=1;
for(int i=1; i<=b; i++)
ans*=a;
return ans;
}
void calc (int pot, int op) {
if (op==0) Num[pot-1]=Num[pot-1]-Num[pot];
if (op==1) Num[pot-1]=Num[pot-1]+Num[pot];
if (op==2) Num[pot-1]=Num[pot-1]*Num[pot];
if (op==4) Num[pot-1]=Pow(Num[pot-1], Num[pot]);
}
LL RESULT (string a) {
int op=0;
int len=a.length();
int p=-1, q=-1;
LL num=0;
for(int i=0; i<len; i++) {
if(a[i]=='a')
Num[++p]=G;
else if (a[i]>='0'&&a[i]<='9')
num=num*10+a[i]-'0';
else if (a[i]!=' ') {
if (num!=0) {
Num[++p]=num;
num=0;
}
if (a[i]=='-') op=0;
if (a[i]=='+') op=1;
if (a[i]=='*') op=2;
if (a[i]=='^') op=4;
if (a[i]=='(') op=8;
if (a[i]==')') op=16;
if (op==8) {
Op[++q]=op;
}
else if (op==16)
while(q>=0&&Op[q--]!=8)
calc(p--,Op[q+1]);
else {
while(q>=0&&Op[q]<=4&&Op[q]/2>=op/2)
calc(p--, Op[q--]);
Op[++q]=op;
}
}
}
if (num) {
Num[++p]=num;
num=0;
}
while(q>=0)
calc(p--, Op[q--]);
return Num[0];
}
int main () {
ios::sync_with_stdio(false);
string a, b;
int flag=1;
getline(cin, a);
//scanf("%d\n", &N);
cin >> N;
getline(cin, b);
for(int i=1; i<=N; i++) {
flag=1;
getline(cin, b);
//for(int j=100; j<=300; j++) {
//G=i;
G=19260817;
if (RESULT(a)!=RESULT(b)) {
flag=0;
//break;
}
//}
if (flag) cout << (char)('A'+i-1);
}
return 0;
}
0 条评论
目前还没有评论...