[PYTHON与CSP的姻缘]2023-3 LDAP

2023-11-18

练习过程

一开始一直以为set输出数字的时候是有序的。。。(扣了一天一直显示错误,不知道哪跟哪,大冤种无语了。。。)
然后改了输出直接满分(。。。。。。。无语ing。。。。。。)

主要注意要考虑到表达式的一些嵌套,这样就可以参考题干中对语句的递归定义来写,用递归进行对表达式的切分处理,切分到原子表达式的时候对原子表达式进行分析

题解


def analysis(token):    # token->string
    ans = set()
    if ":" in token:
        attr,value = map(int,token.split(':'))
        for dn,dic in person.items():
            if attr in dic and value==dic[attr]:
                ans.add(dn)

    elif "~" in token:
        attr,value = map(int,token.split('~'))
        for dn,dic in person.items():
            if attr in dic and value!=dic[attr]:
                ans.add(dn)
    return ans

def work(token):
    ans = set()                                 # 复合条件的用户的dn->set
    if token[0].isdigit():                      # 原子:union-》
        ans = ans.union(analysis(token))
    elif token[0] == '&':                       # 复合->递归
        ans1 = set()                            # 第一个表达式的结果集合->用户dn
        ans2 = set()                            # 第二个表达式的结果集合->用户dn
        
        # 切分第一个表达式
        operater = ['(']                        # 栈,用于判断括号是否闭合
        pos = 1                                 # 指针,标记判断的位置
        while len(operater)!=0:
            pos += 1
            if token[pos] == '(':
                operater.append('(')
            elif token[pos] == ')':
                operater.pop()
        ans1 = work(token[2:pos])

        # 切分第二个表达式
        q = pos+1                               # 指针,标记判断的位置
        operater = ['(']
        while len(operater)!=0:
            q += 1
            if token[q] == '(':
                operater.append('(')
            elif token[q] == ')':
                operater.pop()
        ans2 = work(token[pos+2:q])         # pos是第一个表达式结束的位置,q是第二个表达式结束的位置

        ans = ans1 & ans2

    elif token[0] == '|':
        ans1 = set()
        ans2 = set()
        operater = ['(']
        pos = 1
        while len(operater)!=0:
            pos += 1
            if token[pos] == '(':
                operater.append('(')
            elif token[pos] == ')':
                operater.pop()
        ans1 = work(token[2:pos])

        q = pos+1
        operater = ['(']
        while len(operater)!=0:
            q += 1
            if token[q] == '(':
                operater.append('(')
            elif token[q] == ')':
                operater.pop()
        ans2 = work(token[pos+2:q])


        ans = ans1 | ans2
    return ans

n = int(input())
person = {}                 # DN-ATTR-VALUE
for _ in range(n):
    tmp = list(map(int,input().split()))
    dn = tmp[0]
    for i in range(2,len(tmp),2):
        person.setdefault(dn,{})[tmp[i]] = tmp[i+1]


m = int(input())
for _ in range(m):
    s = input()
    ans = work(s)       # 复合条件的用户的dn->set
    if len(ans)==0:
        print(" ")
        # result.append([])
    else:
        print(*sorted(list(ans)))      # 因为需要递归定义,所以直接用函数写
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[PYTHON与CSP的姻缘]2023-3 LDAP 的相关文章

随机推荐

  • Lack of free swap space on 192.168.3.1

    zabbix健康报错 Lack of free swap space on 192 168 3 1 解决办法 先查看磁盘swap磁盘容量 是因为Zabbix监控没有考虑虚拟主机的交换空间情况 解决办法修改配置 选择 Lack of free
  • easypoi校验数据时获取excel行号和错误信息

    目录 什么是easypoi easypoi校验excel实体类怎么获取错误信息和excel的行号 需要用到的excel实体类 调用的客户端代码 什么是easypoi easypoi功能如同名字easy 主打的功能就是容易 让一个没见接触过p
  • 华为校招机试题- 数组的中心位置-2023年

    题目描述 给你一个整数数组nums 请计算数组的中心位置 数组中心位置是数组的一个下标 其左侧所有元素相乘的积等于右侧所有元素相乘的积 数组第一个元素的左侧积为1 最后一个元素的右侧积为1 如果数组有多个中心位置 应该返回最靠近左边的那一个
  • 修改lvgl Linux demo使用tslib获取触摸坐标

    1 为什么要修改 o 交叉编译官方lvgl linux demo发现触摸坐标不准确 官方demo获取坐标的做法是 evdev fd open EVDEV NAME O RDWR O NOCTTY O NDELAY if evdev fd 1
  • 再谈TCP三次握手/四次挥手

    TCP三次握手 四次挥手 在TCP IP协议中 TCP协议提供可靠的连接服务 采用三次握手建立一个连接 如图1所示 1 第一次握手 建立连接时 客户端A发送SYN包 SYN j 到服务器B 并进入SYN SEND状态 等待服务器B确认 2
  • 比PS还好用!Python 20行代码批量抠图

    抠图前 vs Python自动抠图后 在日常的工作和生活中 我们经常会遇到需要抠图的场景 即便是只有一张图片需要抠 也会抠得我们不耐烦 倘若遇到许多张图片需要抠 这时候你的表情应该会很有趣 Python能够成为这样的一种工具 在只有一张图片
  • cypress——前端自动化测试框架

    前端自动化测试概述 MVC Model View Controller 模式开始流行 MVC是模型 Model 视图 View 和控制器 Controller 的缩写 它使业务逻辑 数据 界面显示分离 这时Web开发属于View层 Ajax
  • Unity InputSystem 实现同一按键单击、双击、长按执行不同逻辑

    最近学习了一下Unity InputSystem 该系统可用于实现 管理复杂的操作逻辑 上限很高 但由于它有一定的学习成本 导致一些和我一样的小白一入门时不得要领 之前卡住我的一个需求就是通过InputSystem 实现同一按键单击 双击
  • java 0-9 A-Z进位函数

    java 可以包含数字0 9 和字母A Z的加法编码规则 例如城市编码 2位 可以是0 9 也可以是A Z 那么实际编码顺序则是0 1 2 3 4 5 6 7 8 9 A B C D E F G A9的下一个编码是AA AZ的下一个编码是B
  • html背景毛玻璃效果代码,css3毛玻璃效果(背景虚化)

    wrap h3 font size 18px color ffffff wrap p font size 14px color ffffff font variant ligatures common ligatures discretio
  • 人工智能--深度学习两层全连接神经网络搭建

    系列文章目录 人工智能 深度学习从感知机到神经网络 人工智能 深度学习神经网络神经元的实现 文章目录 系列文章目录 前言 一 多层神经网络的结构 二 两层全连接神经网络 1 搭建模型 2 神经元传递理论 3 激活函数的确定 三 神经网络实现
  • exe和dll库分离

    c 在写程序的时候一般会用到第三方库 我们在引用后 一般会把第三方库复制到debug生成的目录下 如果第三方库的dll很少那还可以 如果第三方库的dll很多 那么就会和自己生成的exe混在一起 看着极其混乱 所以有时候会把第三方库文件单独的
  • 高端算法总结

    1 合并排序 2 两次筛选 3 BANSAC 4 动态规划 5 Karatsuoa 乘法 6 快速傅里叶变换 7 最大流量算法 8 learing学习算法 9 RSA 10 Strassen 11 单纯型算法 12 奇异值分解 13 求解线
  • upload-labs靶场第一关——第九关

    Pass 01JS检测绕过 1 根据提示 从上述代码中可以看出 上述代码使用了JavaScript脚本 在前端对用户上传文件的类型进行了检测 因此 我们只需要先上传符合JavaScript脚本要求的数据包 然后使用Burpsuit抓取该数据
  • python+Appium自动化:python多线程多并发启动appium服务

    Python启动Appium 服务 使用Dos命令或者bat批处理来手动启动appium服务 启动效率低下 如何将启动Appium服务也实现自动化呢 这里需要使用subprocess模块 该模块可以创建新的进程 并且连接到进程的输入 输出
  • 数据可视化第五章

    基于python的散点图实现 py import ggplot as gp import pandas as pd crime pd read csv crimeRatesByState2005 csv plot gp ggplot gp
  • 有点钱怎么做副业?应该投资哪些副业?

    有点钱怎么做副业 应该投资哪些副业 现在很多上班族 失业族 甚至连带孩子的妈妈们 他们不满足现状 给自己寻找赚钱的机会 一个是为了丰富自己的业余生活 再个就是能更加充实自己的钱包 让自己更为独立 也能自主 现在有哪些小途径可以实现轻松赚钱呢
  • Lua中的定时器

    Lua定时器 Cocos2d x C 中的定时器网上有很多 也很容易找 所以我就不写了 直接Lua吧 在Lua中用定时器的地方很多 我是深有体会啊 比如说我们需要一个函数每帧都执行 那么就可以用定时器来解决啦 旁白 好哇 好哇 终于可以解决
  • 搭建域控和添加本域辅域控,加入域(上)(精准扶小白)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 安装环境 操作系统 Windows2012 一 什么是工作组 域 活动目录 树 林 工作组 处在同一个局域网中的用户 他们也默认处于同一个工作组 且加入工作组不需要信任过程
  • [PYTHON与CSP的姻缘]2023-3 LDAP

    练习过程 一开始一直以为set输出数字的时候是有序的 扣了一天一直显示错误 不知道哪跟哪 大冤种无语了 然后改了输出直接满分 无语ing 主要注意要考虑到表达式的一些嵌套 这样就可以参考题干中对语句的递归定义来写 用递归进行对表达式的切分处