当前位置:   article > 正文

ccf-csp 第二十九次第三题-LDAP(满分python)_csppython ldap

csppython ldap

这题主要注意一下几点

1.储存用户的属性要用字典

2.处理字符串时要用栈,分为两个栈,一个操作栈,一个集合栈,并且要维护每个操作栈所拥有的集合栈个数,当这个操作栈有两个集合栈时,那就可以进行计算,并把结果重新压入集合栈,操作栈出最后一个,并把倒数第二个操作栈所拥有的集合栈加一。此方法可以只用便利一次字符串

3.当有&时先判断这两个集合是否都非空,有一个空就直接的得空,不用进行交运算

 

 代码如下

  1. import sys
  2. sys.setrecursionlimit(100000)
  3. class usr:
  4. def __init__(self,name,s):
  5. self.name=name
  6. self.v={}
  7. self.getv(s)
  8. def getv(self,s):
  9. i=0
  10. while(i<len(s)):
  11. self.v[s[i]]=s[i+1]
  12. i=i+2
  13. def func1(s):
  14. global p
  15. v=[]
  16. if(':' in s):
  17. f=s.find(':')
  18. for i in range(len(p)):
  19. if(p[i].v.get(int(s[0:f]))==int(s[f+1:])):
  20. v.append( p[i].name)
  21. else:
  22. f=s.find('~')
  23. if ('~' in s):
  24. for i in range(len(p)):
  25. if (p[i].v.get(int(s[0:f])) and p[i].v.get(int(s[0:f])) != int(s[f + 1:]) ):
  26. v.append(p[i].name)
  27. return v
  28. def func(s):
  29. c=[]
  30. r=[]
  31. g=[]
  32. i=0
  33. while(i<len(s) ):
  34. while(len(g)!=0 and g[-1]==2 ):
  35. if(len(g)>=2):
  36. g[-2]+=1
  37. g.pop(-1)
  38. if( c[-1]=='|'):
  39. z=list(set(r[-1]).union(set(r[-2])))
  40. r.pop(-1)
  41. r.pop(-1)
  42. r.append(z)
  43. c.pop(-1)
  44. else:
  45. if(r[-1]==[] or r[-2]==[]):
  46. z=[]
  47. else:
  48. z=list(set(r[-1]).intersection(set(r[-2])))
  49. r.pop(-1)
  50. r.pop(-1)
  51. r.append(z)
  52. c.pop(-1)
  53. if(s[i]=='|' or s[i]=='&'):
  54. g.append(0)
  55. c.append(s[i])
  56. i+=1
  57. elif(s[i].isdigit() ):
  58. if(len(g)!=0):
  59. g[-1]+=1
  60. e1=i
  61. j=i
  62. while(j<len(s) and (s[j].isdigit() or s[j]==':' or s[j]=="~")):
  63. j+=1
  64. i = j
  65. r.append(func1(s[e1:j]))
  66. else:
  67. i+=1
  68. while (len(g)>0 and g[-1] == 2):
  69. g[-2] += 1
  70. g.pop(-1)
  71. if (c[-1] == '|'):
  72. z = list(set(r[-1]).union(set(r[-2])))
  73. r.pop(-1)
  74. r.pop(-1)
  75. r.append(z)
  76. c.pop(-1)
  77. else:
  78. z = list(set(r[-1]).intersection(set(r[-2])))
  79. r.pop(-1)
  80. r.pop(-1)
  81. r.append(z)
  82. c.pop(-1)
  83. return r[0]
  84. n=int(input())
  85. p=[]
  86. for i in range(n):
  87. b=list(map(int,input().split(" ")))
  88. u=usr(b[0],b[2:])
  89. p.append(u)
  90. n1=int(input())
  91. for i in range(n1):
  92. r=[]
  93. l=input()
  94. r=func(l)
  95. r.sort()
  96. print(" ".join(map(str,r)))
 

 题目时间限制12s,但我运行了快一分钟也满分了,不知道为啥。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/215717
推荐阅读
相关标签
  

闽ICP备14008679号