这题主要注意一下几点
1.储存用户的属性要用字典
2.处理字符串时要用栈,分为两个栈,一个操作栈,一个集合栈,并且要维护每个操作栈所拥有的集合栈个数,当这个操作栈有两个集合栈时,那就可以进行计算,并把结果重新压入集合栈,操作栈出最后一个,并把倒数第二个操作栈所拥有的集合栈加一。此方法可以只用便利一次字符串
3.当有&时先判断这两个集合是否都非空,有一个空就直接的得空,不用进行交运算
代码如下
import syssys.setrecursionlimit(100000)class usr: def __init__(self,name,s): self.name=name self.v={} self.getv(s) def getv(self,s): i=0 while(i=2): g[-2]+=1 g.pop(-1) if( c[-1]=='|'): z=list(set(r[-1]).union(set(r[-2]))) r.pop(-1) r.pop(-1) r.append(z) c.pop(-1) else: if(r[-1]==[] or r[-2]==[]): z=[] else: z=list(set(r[-1]).intersection(set(r[-2]))) r.pop(-1) r.pop(-1) r.append(z) c.pop(-1) if(s[i]=='|' or s[i]=='&'): g.append(0) c.append(s[i]) i+=1 elif(s[i].isdigit() ): if(len(g)!=0): g[-1]+=1 e1=i j=i while(j 0 and g[-1] == 2): g[-2] += 1 g.pop(-1) if (c[-1] == '|'): z = list(set(r[-1]).union(set(r[-2]))) r.pop(-1) r.pop(-1) r.append(z) c.pop(-1) else: z = list(set(r[-1]).intersection(set(r[-2]))) r.pop(-1) r.pop(-1) r.append(z) c.pop(-1) return r[0]n=int(input())p=[]for i in range(n): b=list(map(int,input().split(" "))) u=usr(b[0],b[2:]) p.append(u)n1=int(input())for i in range(n1): r=[] l=input() r=func(l) r.sort() print(" ".join(map(str,r)))
题目时间限制12s,但我运行了快一分钟也满分了,不知道为啥。