//水题,不过又是邪恶的int改long long刷了几个WA //题目求等价表达式,式子中未知量只有 a 可以用数代替a 水过去 //栈转序处理比较传统 #include <iostream> #include <string> #include <cmath> using namespace std; long long check = 23, result_t,final; long long num[50],op[50]; //pow long long pow_int( long long a,long long b ) { long long k = 1; for( int i = 0;i < b;i++ ) { k *= a; } return k; } //对栈的顶两个数进行op void cul( int p,int op ) { if( op == 0 ) num[p-1] = num[p-1]+num[p]; if( op == 1 ) num[p-1] = num[p-1]-num[p]; if( op == 2 ) num[p-1] = num[p-1]*num[p]; if( op == 5 ) num[p-1] = pow_int( num[p-1],num[p] ); } //主要函数 long long result( string str ) { int op_nxt, len = str.length(), p = -1, q = -1; //数栈和op栈的指针 long long num_nxt = 0; for( int i = 0;i < len;i++ ) { if( str[i] == 'a' ) { num[++p] = check; } else if( str[i] >= '0' && str[i] <= '9' ) { num_nxt = num_nxt*10 + (str[i]-'0'); } else if( str[i] != ' ' ) { if( num_nxt != 0 ) { num[++p] = num_nxt; num_nxt = 0; } if( str[i] == '+' ) op_nxt = 0; if( str[i] == '-' ) op_nxt = 1; if( str[i] == '*' ) op_nxt = 2; if( str[i] == '^' ) op_nxt = 5; if( str[i] == '(' ) op_nxt = 6; if( str[i] == ')' ) op_nxt = 7; if( op_nxt == 6 ) { op[++q] = op_nxt; } else if( op_nxt == 7 ) { while( q >= 0 && op[q--] != 6 ) { cul( p--,op[q+1] ); } } else { //优先级高的op出栈 while( q >= 0 && op[q] <= 5 && op[q]/2 >= op_nxt/2 ) { cul( p--,op[q--] ); } op[++q] = op_nxt; } } } //记得最后要清空栈 if( num_nxt != 0 ) { num[++p] = num_nxt; num_nxt = 0; } while( q >= 0 ) { cul( p--,op[q--] ); } return num[0]; } // atoi不让用 sicily int myatoi( string str ) { int result = 0, len = str.length(); for( int i = 0; i < len; i++ ) { result = result*10 + (str[i]-'0'); } return result; } int main() { //freopen("1.txt","r",stdin); string str1,str2; int n; final = 0; getline(cin,str1); getline(cin,str2); n = myatoi( str2 ); result_t = result( str1 ); while( n-- ) { getline(cin,str2); if( result(str2) == result_t ) { cout<<(char)('A'+final); } final++; } cout<<endl; return 0; }
很久没刷题了,先找找状态吧