这题主要注意一下几点
1.储存用户的属性要用字典
2.处理字符串时要用栈,分为两个栈,一个操作栈,一个集合栈,并且要维护每个操作栈所拥有的集合栈个数,当这个操作栈有两个集合栈时,那就可以进行计算,并把结果重新压入集合栈,操作栈出最后一个,并把倒数第二个操作栈所拥有的集合栈加一。此方法可以只用便利一次字符串
3.当有&时先判断这两个集合是否都非空,有一个空就直接的得空,不用进行交运算
代码如下
import sys
sys.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<len(s)):
self.v[s[i]]=s[i+1]
i=i+2
def func1(s):
global p
v=[]
if(':' in s):
f=s.find(':')
for i in range(len(p)):
if(p[i].v.get(int(s[0:f]))==int(s[f+1:])):
v.append( p[i].name)
else:
f=s.find('~')
if ('~' in s):
for i in range(len(p)):
if (p[i].v.get(int(s[0:f])) and p[i].v.get(int(s[0:f])) != int(s[f + 1:]) ):
v.append(p[i].name)
return v
def func(s):
c=[]
r=[]
g=[]
i=0
while(i<len(s) ):
while(len(g)!=0 and g[-1]==2 ):
if(len(g)>=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<len(s) and (s[j].isdigit() or s[j]==':' or s[j]=="~")):
j+=1
i = j
r.append(func1(s[e1:j]))
else:
i+=1
while (len(g)>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,但我运行了快一分钟也满分了,不知道为啥。