CCF 201809-3 2018年9月第三题元素选择器(python 100分题解)

40 篇文章 1 订阅

问题描述

试题编号:3
试题名称:元素选择器
时间限制:10.0s
内存限制:512.0MB
问题描述:




提交后100分代码:

注意标签选择器大小写不敏感,匹配时都转成小写,id选择器大小写敏感直接匹配

#元素选择器
#输入
n,m=map(int,input().split())
doc = []
sel = []
#结构化文档内容
for i in range(n):
    doc.append(input())
#带查询的选择器
for i in range(m):
    sel.append(input())

#解析文档结构
cons = []
for i in range(n):
    level = doc[i].count('.')//2
    tag = ""
    tid = ""
    if(len(doc[i].split())==1):
        tag = doc[i][level*2:]
    else:
        left,right = doc[i].split()
        tag = left[level*2:]#标签大小写不敏感
        tid = right#id大小写敏感
    pline = -1;
    for j in range(i-1,0-1,-1):
        if(cons[j]["level"]==level-1):
            pline = j+1;
            break;
    cons.append({"tag":tag,"id":tid,"level":level,"pline":pline})#将信息存为字典添加到列表中

#元素选择器选择
collection=[]#结果保存列表
for i in range(m):
    collection.append([])
    if(len(sel[i].split())==1):#选择器不含空格
        if(sel[i][0]!='#'):#标签选择器
            for j in range(n):
                if(cons[j]["tag"].lower() == sel[i].lower()):#标签大小写不敏感
                    collection[i].append(j+1)   
        else:#id选择器
            for j in range(n):
                if(cons[j]["id"] == sel[i]):#id大小写敏感
                    collection[i].append(j+1)
    else:#后代选择器
        
        p = sel[i].split()
        for j in range(n):
            parent = j+1
            k=len(p)-1
            while k>=0:#从后向前迭代检查是否匹配
                match =False
                if(p[k][0]!='#'):
                    if(cons[parent-1]["tag"].lower() == p[k].lower()):
                        match = True
                    else:
                        if(parent == j+1 and k==len(p)-1):#第一次必须匹配上不然直接退出
                            break
                else:
                    if(cons[parent-1]["id"] == p[k]):
                        match = True
                    else:
                        if(parent == j+1 and k==len(p)-1):
                            break
                if(match):
                    k-=1
                    if(k<0):#匹配成功
                        collection[i].append(j+1)
                        break
                if(cons[parent-1]["pline"]==-1):#没有父节点了仍未匹配成功即匹配失败
                    break#匹配失败退出
                parent = cons[parent-1]["pline"]#取父节点继续检查匹配
                
#输出
for x in collection:    
    print(len(x)," ".join(map(str,x)))

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值