#include<iostream>
#include<cstdlib>
#include<stack>
#include<string>
#include<vector>
#include<cmath>
#include<cctype>
using namespace std;
string infixToPostfix(string infix)
{
string postfix;
stack<char> temp;
for(int i = 0; i < infix.length(); i++)
{
if(isdigit(infix[i]))
{
while(i < infix.length() && isdigit(infix[i]))
{
postfix += infix[i];
i++;
}
i--;
postfix += "#"; //区别这个是常数
}
else if (infix[i] >='a' && infix[i] <='z')
postfix += infix[i];
else
{
switch(infix[i])
{
case '(' :
temp.push(infix[i]); break;
case ')' :
while(!temp.empty() && temp.top() != '(')
{
postfix += temp.top();
temp.pop();
}
temp.pop(); break;
case '^' :
while(!temp.empty() && (temp.top() == '^' || temp.top() == '('))
{
postfix += temp.top();
temp.pop();
}
temp.push(infix[i]);break;
case '*' :
while(!temp.empty() && temp.top() != '+' && temp.top() != '-' && temp.top() != '(')
{
postfix += temp.top();
temp.pop();
}
temp.push(infix[i]);break;
case '/' :
while(!temp.empty() && temp.top() != '+' && temp.top() != '-' && temp.top() != '(')
{
postfix += temp.top();
temp.pop();
}
temp.push(infix[i]);break;
case '+' :
while(!temp.empty() && temp.top() != '(' )
{
postfix += temp.top();
temp.pop();
}
temp.push(infix[i]);break;
case '-' :
while(!temp.empty() && temp.top() != '(' )
{
postfix += temp.top();
temp.pop();
}
temp.push(infix[i]);break;
}
}
}
while(!temp.empty())
{
postfix += temp.top();
temp.pop();
}
return postfix;
}
long long power(long long a, long long b)
{
long long ans = 1;
for(int i = 0; i < b; i++)
ans *= a;
return ans;
}
long long evalPostFix(string postfix)
{
int num = 999;
int len = postfix.length();
stack<long long> ans;
for(int i = 0; i < len; i++)
{
if(postfix[i] == 'a')
ans.push(num);
else if(isdigit(postfix[i]))
{
long long tmp = 0;
while(i < len && isdigit(postfix[i]))
{
tmp = tmp*10 + (postfix[i] - '0');
i++;
}
i--;
ans.push(tmp);
}
else if(postfix[i] == '+')
{
long long tmp1 = ans.top();
ans.pop();
long long tmp2 = ans.top();
ans.pop();
ans.push(tmp1 + tmp2);
}
else if(postfix[i] == '-')
{
long long tmp1 = ans.top();
ans.pop();
long long tmp2 = ans.top();
ans.pop();
ans.push(tmp2 - tmp1);
}
else if(postfix[i] == '*')
{
long long tmp1 = ans.top();
ans.pop();
long long tmp2 = ans.top();
ans.pop();
ans.push(tmp1 * tmp2);
}
else if(postfix[i] == '^')
{
long long tmp1 = ans.top();
ans.pop();
long long tmp2 = ans.top();
ans.pop();
ans.push(power(tmp2, tmp1));
}
}
return ans.top();
}
/*char evalPostFix(string postfix)//此函数利用栈对后缀表达式求值
{
stack<double> s;
double a,b,result;
for(int i = 0; i < postfix.size(); i++)
{
result =atof(postfix.c_str());
if(result != 0.0)
s.push(result);
else if(postfix == "0.0")
s.push(result);
else
switch(postfix[0])
{
case '+':a=s.top();s.pop();b=s.top();s.pop();
s.push(a+b);break;
case '-':a=s.top();s.pop();b=s.top();s.pop();
s.push(a-b);break;
case '*':a=s.top();s.pop();b=s.top();s.pop();
s.push(a*b);break;
case '/':a=s.top();s.pop();b=s.top();s.pop();
s.push(a/b);break;
case '^':a=s.top();s.pop();b=s.top();s.pop();
s.push(exp(a*log(b)));break;
}
cout<<"test2";
}
cout<<s.top();
return s.top();
} */
int main()
{
vector<char> out;
long long temp;
string infix, postfix;
cin >> infix;
postfix = infixToPostfix(infix);
temp = evalPostFix(postfix);
int n;
cin>>n;
for(int i = 0 ; i < n ; i++)
{
long long temp2;
string infix2, postfix2;
cin >> infix2;
postfix2 = infixToPostfix(infix2) ;
temp2 = evalPostFix(postfix2);
if(temp2 == temp)
{
char c;
c='A'+i;
out.push_back(c);
}//通过指针X来逐个向output元素赋值
}
for(int i = 0 ; i < out.size() ; i++)
{
cout<<out[i];
}
return 0;
}
/*
#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
using namespace std;
string s0,s1;
int n;
long long a0[200],a1[200];
string nn[1000];
char op[1000]; //数字栈,符号栈
int nnn,opn;
bool m[7][7]={//算符优先级
{0,0,0,0,1,0,1},
{0,0,0,0,1,0,1},
{1,1,0,0,1,0,1},
{1,1,1,0,1,0,1},
{1,1,1,1,1,1,1},
{0,0,0,0,1,0,0},
{0,0,0,0,0,0,1}
};//+ - * ^ ( ) #
long long power(long long aa, long long bb)
{
if(bb==0) return 1;
return aa*power(aa, bb-1);
}
long long comp(long long x, long long y, char c)
{
switch(c)
{
case '+': return x+y;
case '-': return x-y;
case '*': return x*y;
case '^': return power(x,y);
}
}
void compute(string s, long long a[])
{
long long sta[100];
int stan;
for(long long digit=-80;digit<=80;digit++)
{
stan=0;
for(int i=0;i<s.size();/*在循环体中i会累加*/)
/* {
sta[stan++]=0;
while(s[i]!='@')
{
if(s[i]=='a')
sta[stan-1]=digit;
else
sta[stan-1]=sta[stan-1]*10+(s[i]-'0');
i++;
}
i++;
while(!(isdigit(s[i])||s[i]=='a'||i>=s.size()))
sta[--stan-1]=comp(sta[stan-1],sta[stan],s[i++]);
}
a[digit+80]=sta[0];
}
}
int cast(char c)
{
switch(c)
{
case '+': return 0;
case '-': return 1;
case '*': return 2;
case '^': return 3;
case '(': return 4;
case ')': return 5;
case '#': return 6;
}
}
bool pre(char c1, char c2)
{
return m[cast(c1)][cast(c2)];
}
string postexp(string s)
{
string tmp;
nnn=opn=0;
op[opn++]='#';
for(int i=0;i<s.size();++i)
{
if(s[i]==' ')
continue;
if(isdigit(s[i])||s[i]=='a')
{
tmp="";
for(;isdigit(s[i])||s[i]=='a';++i)
tmp.append(1,s[i]);
tmp.append(1,'@');//数字之间的分割符号
--i;
nn[nnn++]=tmp;
}
else
{
if(s[i]!=')' && pre(s[i],op[opn-1]))//优先级高压栈
op[opn++]=s[i];
else
{
while(!pre(s[i],op[opn-1]))
{
nn[--nnn].append(1,op[--opn]
评论0