洛谷上过了,在别的网站上只有80!!!
#include<bits/stdc++.h>
#define int long long
#define N 1000000002
using namespace std;
string s;
int num[105],q[105],key[255],ans,t,cnt;
stack<char>st;
int da,n;
bool ff(string s){
int h=0;
for(int i=0;i<s.size();i++){
if(s[i]=='(')h++;
if(s[i]==')')h--;
if(h<0)return 0;
}
return !h;
}
int fpow(int a,int b,int p){
int ans=1,t=a;
while(b){
if(b%2)ans=(ans*t)%p;
t=(t*t)%p;
b/=2;
}
return ans;
}
int bds(string s){
while(!st.empty())st.pop();
memset(num,0,sizeof(num));
memset(q,0,sizeof(q));
ans=t=cnt=0;
char stk[105]={},pd[105]={};
key['+']=key['-']=1;
key['*']=2;
key['^']=3;
for(int i = 1,j=0;i<=s.size();++i){
if(s[i]>='0'&&s[i]<='9'){
if(!j)num[++t]=s[i]-'0',j=1;
else num[t]=num[t]*10+s[i]-'0';
}
else{
j=0;
if(s[i]=='-'&&(i==1||s[i-1]=='('))num[++t]=0;
if(s[i]=='(')stk[++cnt]=s[i];
else if(s[i]==')'){
if(!cnt)continue;
while(stk[cnt]!='(')pd[++t]=stk[cnt--];
--cnt;
}
else if(cnt&&key[s[i]]<key[stk[cnt]]){
while(cnt&&stk[cnt]!='('&&key[s[i]]<=key[stk[cnt]])pd[++t]=stk[cnt--];
stk[++cnt]=s[i];
}
else if(cnt&&key[s[i]]==key[stk[cnt]]){
while(cnt&&key[s[i]]==key[stk[cnt]])pd[++t]=stk[cnt--];
stk[++cnt]=s[i];
}
else stk[++cnt]=s[i];
}
}
while(cnt)pd[++t]=stk[cnt--];
for(int i = 1;i<=t;++i){
if(pd[i]=='+')q[cnt-1]=(q[cnt-1]+q[cnt])%N,--cnt;
else if(pd[i]=='-')q[cnt-1]=((q[cnt-1]-q[cnt])%N+N)%N,--cnt;
else if(pd[i]=='*')q[cnt-1]=(q[cnt-1]*q[cnt])%N,--cnt;
else if(pd[i]=='^')q[cnt-1]=fpow(q[cnt-1],q[cnt],N),--cnt;
else q[++cnt]=num[i];
}
return q[1];
}
string read(){
string stk;
char c = '0';
while(c=='('||c==')'||c=='*'||c=='+'||c=='-'||c==' '||c=='^'||(c>='0'&&c<='9')||c=='a'){
c=getchar();
if(c=='a')stk=stk+"10001";
else if(c!=' ')stk=stk+c;
}
stk=' '+stk;
return stk;
}
signed main(){
s=read();
da=bds(s);
cin >> n;
read();
for(int i = 'A';n--;i++){
read();
s=read();
if(ff(s)){
int f = bds(s);
if(f==da)cout << char(i);
}
}
return 0;
}