RT,蒟蒻直接跑打暴力。。
但是#10跑6s左右过不去/kk
加了各种玄学优化(比如奇怪的hash、size优化、剪枝),然而还是T
QAQ
求优化/kel
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <assert.h>
#include <stack>
#include <unordered_map>
#include <stdlib.h>
#define int unsigned long long
inline int read()
{
int num = 0; char c = getchar();
while (c<48 || c>57)c = getchar();
while (c >= 48 && c <= 57)num = (num << 3) + (num << 1) + (c ^ 48), c = getchar();
return num;
};
int a;
struct Node{
int type;//0=^!&|
int num;
Node *lc,*rc;
int sz;
}*r;
std::unordered_map<int,char> ma;
//std::stack<Node*> s;
Node* s[100005];
int pos=0;
void build2(Node *r,Node *fa,Node *root,int p)
{
//putchar('(');
if(r->type==1)
{
r->sz=1;
return;
}
if(r->num=='!'&&r->rc->type==0&&r->rc->num=='!'&&r!=root)
{
if(p)
{
fa->rc=r->rc->rc;
build2(fa->rc,fa,root,1);
}
else
{
fa->lc=r->rc->rc;
build2(fa->lc,fa,root,0);
}
return;
//Node *p=r->rc->rc;
//delete(r->rc);
//r->rc=p;
}
if(r->lc)build2(r->lc,r,root,0),r->sz+=r->lc->sz;
//if(r->type)printf("%d",r->num);
//else putchar(r->num);
if(r->rc)build2(r->rc,r,root,1),r->sz+=r->rc->sz;
r->sz++;
if(r->lc)
{
if(r->lc->sz>r->rc->sz)
{
Node *o=r->lc;r->lc=r->rc;r->rc=o;
}
}
//putchar(')');
}
void build(Node *r)
{
putchar('(');
if(r->lc)build(r->lc);
if(r->type)printf("%d",r->num);
else putchar(r->num);
if(r->rc)build(r->rc);
putchar(')');
}
short hash[59731027];
short ffff[59731027];
inline int get(int p)
{
int u=p%59731027;
while(hash[u])
{
if(ffff[u]==p)return u;
u=(u+14285008)%59731027;
}
return u;
}
int calc(Node *r)
{
if(r->type==1)return (a>>r->num)&1;
if(r->num=='|')return (calc(r->lc)==1?1:calc(r->rc));
if(r->num=='&')return (calc(r->lc)==0?0:calc(r->rc));
if(r->num=='^')return calc(r->lc)^calc(r->rc);
if(r->num=='!')return !calc(r->rc);
return 114514;
}
int u[64];
signed main()
{
int n=read(),ans=0;
for(int i=0;i<n;i++)
{
char c[5];
scanf("%s",&c);
//puts("AL");
Node *e=new Node();
if(c[1])
{
//Node *e;
e->type=1;
e->num=(c[0]-48)*10+c[1]-48;
u[e->num]=1;
e->lc=e->rc=NULL;
s[pos++]=e;
}
else if(c[0]>47&&c[0]<58)
{
//printf("%s z\n",c);
//Node *e;
e->type=1;
//printf("%s z\n",c);
e->num=(c[0]-48);
u[e->num]=1;
//printf("%s z\n",c);
e->lc=e->rc=NULL;
//printf("%s z\n",c);
s[pos++]=e;
//printf("%s z\n",c);
}
else
{
if(c[0]=='!')
{
//Node *e;
Node *p=s[--pos];
e->rc=p;e->lc=NULL;
e->num=c[0];e->type=0;
}
else
{
//Node *e;
Node *p=s[--pos];
Node *q=s[--pos];
if(n<=50000)e->lc=p,e->rc=q;
else e->lc=q,e->rc=p;
e->num=c[0];e->type=0;
}
s[pos++]=e;
}
r=e;
}
//build2(r);
build2(r,r,r,0);
//build(r);
int M=read(),tm;
while(M--)
{
a=read();
int qaq=get(a);
if(hash[qaq])
{
putchar(hash[qaq]);
continue;
}
int p=calc(r)+48;
putchar(p);
hash[qaq]=p;
ffff[qaq]=a;
/*tm=ma[a];
if(tm)putchar(tm);
else
{
tm=calc(r)+48;
putchar(tm);
///hash[a%59731027]=tm;
ma[a]=tm;
}*/
}
//printf("%lld\n",);
return 0;
}