fork download
  1. l=len
  2. r=range
  3. R=lambda a:r(l(a))
  4. def A(a,b):
  5. for x in b:z=l(a)-1;x[0]<<=z;x[1]<<=z
  6. for x in a:
  7. if x[2]:
  8. for z in r(3):x[z]=b[0][z]
  9. return a+b[1:]
  10. def B(a,b):
  11. c=[]
  12. for i in a:
  13. for j in b:
  14. c+=[[0,0,i[2]or j[2]]]
  15. for z in[0,1]:
  16. for k in R(a):c[-1][z]|=(i[z]>>k)%2*j[z]<<k*l(b)
  17. return c
  18. def C(s,i):
  19. S=[];T=[]
  20. while i<l(s):
  21. c=s[i]
  22. if"("==c:a,i=C(s,i+1);T+=a,
  23. if")"==c:break
  24. if c in'01':X=[[4,4,0],[4,4,1],[4,4,0]];X[0][c>'0']=2;T+=X,
  25. if"ε"==c:T+=[[2,2,1],[2,2,0]],
  26. if"|"==c:
  27. t=T[0]
  28. for j in r(1,l(T)):t=A(t,T[j])
  29. S+=t,;T=[]
  30. if"*"==c:
  31. a=T[-1];a[0][2]=1
  32. for x in a:
  33. if x[2]:x[0]|=a[0][0];x[1]|=a[0][1]
  34. i+=1
  35. t=T[0]
  36. for j in r(1,l(T)):t=A(t,T[j])
  37. S+=t,;t=S[0]
  38. for j in r(1,l(S)):t=B(t,S[j])
  39. return t,i
  40. I=input().split(",")
  41. a=C(I[0],0)[0]
  42. b=C(I[1],0)[0]
  43. Q=[(1,1)]
  44. d=1
  45. V=set(Q)
  46. while Q:
  47. p,q=Q.pop();d*=any([p>>i&(0<a[i][2])for i in R(a)])<=any([q>>i&(0<b[i][2])for i in R(b)])
  48. for z in[0,1]:
  49. u=(sum((p>>i&1)*a[i][z]for i in R(a)),sum((q>>i&1)*b[i][z]for i in R(b)))
  50. if~-(u in V):V.add(u);Q.append(u)
  51. print(d)
Success #stdin #stdout 0.11s 14036KB
stdin
(0|1)*,(0(1*))*
stdout
0