ccf 201809-3 元素选择器
一、思路:
1、将结构化文档的每一行处理成一个节点(可定义一个结构体,成员包含标签tag、属性id、层级level、祖先所在行数father)。
2、然后整个结构化文档就成了一个树形结构,可从任一节点轻松访问到祖先节点。
3、从1到n行遍历文档,将后代选择器从后往前依次与第i行所在节点及其祖先节点匹配。
4、【提示】多级的后代选择器在匹配时,可以采用贪心的策略:除最后一级外,前面部分都可以尽量匹配层级小的元素(在树中较深的节点)。
一开始没懂提示在说啥,后来做出来只有80分,百度了一下才知道:祖先的祖先仍是祖先。
例如 div p 这个命令,如果p是第10级,div是第1级,这个p也能被选中。
5、注意:tag对大小写不敏感,id属性对大小写敏感。
二、代码:
对C++STL的string类型和stringstream流不熟悉,因此虽是C++代码,但有点偏C的风格。
#include<cstdio>
#include<vector>
#include<stack>
#include<cstring>
#include<iostream>
using namespace std;
const int N=;
const int M=;
struct node
{
char tag[M],id[M];
int level,father;
};
node text[N];
bool equal(char*str1,char*str2)
{
while(*str1||*str2){
if(*str1>=''&&*str1<=''){
if(*str1!=*str2)return false;
}
else{
if(*str1>'Z')*str1-=;
if(*str2>'Z')*str2-=;
if(*str1!=*str2)return false;
}
str1++;str2++;
}
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
int n,m;
stack<pair<int,int> >fa;
fa.push(make_pair(-,-));
scanf("%d%d",&n,&m);
getchar();
for(int i=;i<=n;i++){
char str[M];
//gets(str);
fgets(str,M,stdin);
//cout<<i<<' '<<str<<endl;
int j=;
while(str[j]=='.')j++;
text[i].level=j/;
pair<int,int>par=fa.top();
//cout<<par.first<<' '<<par.second<<endl;
while(par.second>=text[i].level){
fa.pop();par=fa.top();
//cout<<par.first<<' '<<par.second<<endl;
}
//cout<<endl;
text[i].father=par.first;
if(sscanf(str+j,"%s%s",text[i].tag,text[i].id)==)text[i].id[]=;
fa.push(make_pair(i,text[i].level));
}
/*
for(int i=1;i<=n;i++){
node&t=text[i];
cout<<t.father<<' '<<t.level<<' '<<t.tag<<' '<<t.id<<endl;
}
*/
//getchar();
while(m--){
int i=;
vector<int>ans;
char c,order[M],temp[M];
while((c=getchar())!=EOF&&c!='\n'){
order[i++]=c;
}
order[i]=;
int len=i;
for(int k=;k<=n;k++){
int now=k,flag=;
i=len;
while(){
while(i>=&&order[i]!=' ')i--;
sscanf(order+i+,"%s",temp);
if(temp[]=='#'){
if(strcmp(temp,text[now].id)==){
flag=;
if(i==-)ans.push_back(k);
i--;
}
else if(flag==)i=-;
else i++;
}
else {
if(equal(temp,text[now].tag)){
flag=;
if(i==-)ans.push_back(k);
i--;
}
else if(flag==)i=-;
else i++;
}
now=text[now].father;
if(now==-)i=-;
if(i<)break;
}
}
printf("%d",ans.size());
for(i=;i<ans.size();i++){
printf(" %d",ans[i]);
}
printf("\n");
}
return ;
}
ccf 201809-3 元素选择器的更多相关文章
- CCF(元素选择器:50分):字符串+模拟
元素选择器 201809-3 这里我只考虑了没有后代选择器的情况 #include<iostream> #include<cstdio> #include<cstring ...
- 深入学习jQuery选择器系列第八篇——过滤选择器之伪子元素选择器
× 目录 [1]通用形式 [2]反向形式 [3]首尾元素 [4]唯一元素 前面的话 本文是子元素选择器的续篇,主要介绍关于nth-of-type()选择器的内容.该部分内容并非没有出现在<锋利的 ...
- 深入学习jQuery选择器系列第二篇——过滤选择器之子元素选择器
× 目录 [1]通用形式 [2]反向形式 [3]首尾元素 [4]唯一元素 前面的话 在上一篇中已经介绍过基础选择器和层级选择器,本文开始介绍过滤选择器.过滤选择器是jQuery选择器中最为庞大也是最为 ...
- CSS之元素选择器
1.后代元素选择器 div p 以空格分隔,表示div的所有后代p元素 2.子元素选择器 div > p 以大于号分隔,表示div的直接子元素 3.相邻兄弟选择器 div + p 选择紧接在d ...
- css伪类选择器及伪元素选择器
1.类选择器 在css中可以使用类选择器把相同的元素定义成不同的样式.比如: 结果如下: 标题背景未变 2.伪类选择器 类选择器和伪类选择器的区别在于,类选择器我们定义的,而伪类选择器是CSS中已经定 ...
- CSS中模拟父元素选择器
很多情况下,我们需要找到父元素,但可惜的是css中并没有这样的一个选择器. 至于原因可以看张鑫旭的如何在CSS中实现父选择器效果这篇文章. 简单来说这个实现并不是真正的父元素选择器,只是利用其它思路来 ...
- jquery子元素选择器
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- css伪元素选择器
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- CSS_03_04_CSS伪元素选择器
第01步:编写css代码:wei.css @charset "utf-8"; /* 伪元素选择器 :状态 效果顺序:L V H A */ a:link.lin_01{/*超链接,未 ...
- CSS 子元素选择器与后代选择器区别实例讲解
css子元素选择器和后代选择器在功能描述上非常相同,但是他们其实是有区别的,本文章通过两个简单的实例向大家介绍子元素选择器与后代选择器的区别,需要的朋友可以参考一下. 首先我们来了解一下子元素选择器与 ...
随机推荐
- confd + Nacos | 无代码侵入的配置变更管理
Java技术栈 www.javastack.cn 优秀的Java技术公众号 来文来自阿里中间件投稿 作者:风卿,Nacos Committer,阿里巴巴开发工程师 为什么要支持confd,老的应用配置 ...
- luoguP1311 选择客栈 题解(NOIP2011)
P1311 选择客栈 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...
- 2019牛客暑期多校训练营(第一场) - H - XOR - 线性基
https://ac.nowcoder.com/acm/contest/881/H 题意: 给定n个整数,求其中异或和为 \(0\) 的子集的大小的和. 题解思路: 首先转化为每个可以通过异或表示 \ ...
- 【JMeter4.0】二、JMeter4.0安装与配置
二.安装配置JMeter jmeter是一个纯java工具,因此,JDK必不可少,现在最新版的jmeter是4.0,建议使用1.8及以上的JDK安装配置JDK,如没有,请见:[JMeter4.0]一. ...
- Android手机、电视(盒子) 打开ADB调试 一览表
手机.电视(盒子) 打开ADB调试 一览表 一.手机打开ADB调试方法 序号 名称 描述 方式 1 华为手机 EMUI 1.设置 ->关于手机-> 版本号 点击(4~5次)2.返回设置 - ...
- springcloud费话之配置中心基础(SVN)
目录: springcloud费话之Eureka基础 springcloud费话之Eureka集群 springcloud费话之Eureka服务访问(restTemplate) springcloud ...
- post请求中的参数形式和form-data提交数据时取不到的问题
@Controller页面form表单请求时不会丢数据返回json数据时需要加 注解@ResponseBody请求格式如下 @ResponseBody public Object login(Sign ...
- 第十五章 Kubernetes调度器
一.简介 Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上.听起来非常简单,但有很多要考虑的问题: ① 公平:如何保证每个节点都能被分配资源 ② ...
- python如何简单的处理图片(1):打开\显示
一提到数字图像处理,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因此, ...
- java两个引用指向同一个对象