#include<bits/stdc++.h>
#define F(i,a,b,c) for(int i=(a);(b);i=(c))
#define Fu(i,a,b) F(i,(a),i<=(b),i+1)
#define Fd(i,a,b) F(i,(a),i>=(b),i-1)
const int inf=1073741823;typedef long long LL;
int Fl,ch;template<typename t>int in(t&a){a=0;ch=getchar();Fl=1;while(((ch<'0')||(ch>'9'))&&ch!=EOF)Fl=(ch=='-')?-Fl:Fl,ch=getchar();if(ch==EOF)return 0;while((ch>='0')&&(ch<='9'))a=a*10+ch-'0',ch=getchar();a*=Fl;return 1;}template<typename t,typename ...ARGS>int in(t&a,ARGS&...args){return in(a)+in(args...);}
using namespace std;
struct node{int x;char op;}a[100],b[100];
#define mod 998244353
int ans17,ans19,bl,m;
void RD(node*a,int&len)
{
ch=getchar();
while(!isprint(ch))ch=getchar();
len=1;
while(isprint(ch))
{
if(isdigit(ch))(a[len].x*=10)+=ch-'0';
else if(isgraph(ch))
{
if(ch!='a')
++len,a[len].op=ch,++len;
else a[len].x=1073741824;
}
ch=getchar();
}
if(!a[len].x)--len;
a[0].op='(';
a[len+1].op=')';
}
int al;
void print(node*a,int l,int r)
{
Fu(i,l,r)
{
if(a[i].op)putchar(a[i].op);
else
{
if(a[i].x==1073741024)printf("a");
else
if(a[i].x)
printf("%d",a[i].x);
}
}
putchar(10);
}
int Pw(int x,int y)
{
int res=1;
for(;y;y>>=1,x=(x*x)%mod)if(y&1)res=(res*x)%mod;
return res;
}
void cl(int l,int r,int an,node*a)
{
// printf("[%d,%d]\n",l,r);
int cl=0,cr=0;
// print(a,l,r);
Fu(i,l+1,r-1)if(a[i].op=='^')
{
cl=i-1;cr=i+1;
while(a[cl].x==0&&cl>l)--cl;
while(a[cr].x==0&&cr<r)++cr;
a[cl].x=Pw(a[cl].x,a[cr].x);
a[i].op=0;a[cr].x=0;
}
// printf("^ : ");print(a,l,r);
Fu(i,l+1,r-1)if(a[i].op=='*')
{
cl=i-1;cr=i+1;
while(a[cl].x==0&&cl>l)--cl;
while(a[cr].x==0&&cr<r)++cr;
a[cl].x=a[cl].x*a[cr].x;
a[i].op=0;a[cr].x=0;
}
// printf("* : ");print(a,l,r);
Fu(i,l+1,r-1)if(a[i].op=='+'||a[i].op=='-')
{
cl=i-1;cr=i+1;
while(a[cl].x==0&&cl>l)--cl;
while(a[cr].x==0&&cr<r)++cr;
if(a[i].op=='+')a[cl].x=(a[cl].x+a[cr].x)%mod;
else a[cl].x=(a[cl].x-a[cr].x)%mod;
a[i].op=0;a[cr].x=0;
}
// printf("+-: ");print(a,l,r);
}
void calc(int l,int r,node*a)
{
stack<int>s;
int ans=0,st;
// Fu(i,l,r)putchar(a[i].op?a[i].op:'_');
Fu(i,l,r)
{
if(a[i].op=='(')s.push(i+1);
if(a[i].op==')')
{
st=s.top();s.pop();
cl(st,i-1,r,a);
a[st-1].op=0;
a[i].op=0;
}
}
cl(1,al,al,a);
// print(a,l,r);
// putchar(10);
}
pair<int,int>ck(node*A,int Al)
{
pair<int,int>res;
node C[100];
Fu(i,1,Al)C[i]=A[i];Fu(i,1,Al)if(A[i].x==1073741824)C[i].x=17;
calc(1,Al,C);Fu(i,1,Al)if(C[i].x){res.first=C[i].x;break;}
Fu(i,1,Al)C[i]=A[i];Fu(i,1,Al)if(A[i].x==1073741824)C[i].x=19;
calc(1,Al,C);Fu(i,1,Al)if(C[i].x){res.second=C[i].x;break;}
return res;
}
int main()
{
freopen("equal.in","r",stdin);
freopen("equal.out","w",stdout);
RD(a,al);pair<int,int>ckans=ck(a,al);
// printf("%d %d\n",ckans.first,ckans.second);
in(m);
Fu(i,1,m)
{
Fu(i,1,50)b[i].x=b[i].op=0;
RD(b,bl);
// print(b,bl);
pair<int,int>bck=ck(b,bl);
if(bck.first==ckans.first&&bck.second==ckans.second)
putchar(i+'@');
// printf("\n%d %d %d\n",i,bck.first,bck.second);
}
return 0;
}
//BY 线段树蒟蒻
/*
(a+1)^2
3
(a-1)^2+4*a
a+1+a
a^2+2*a*1+1^2+10-10+a-a
*/
为了方便留好了调试接口。
比较有可能是calc
和cl
函数出现问题。
外层无错。。。
(a+1+5)^3
1
(a +3*(1+5))*a^2+((1+5)*2*(1+5)+(1+5)^2)*a+(1+5)^3
这个有问题/kk