赞
踩
这题主要注意一下几点
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,但我运行了快一分钟也满分了,不知道为啥。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。