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子元素选择器和后代选择器在功能描述上非常相同,但是他们其实是有区别的,本文章通过两个简单的实例向大家介绍子元素选择器与后代选择器的区别,需要的朋友可以参考一下. 首先我们来了解一下子元素选择器与 ...
随机推荐
- 中标麒麟V6.0安装 mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
在中标麒麟6.0上安装mysql, 1.先从官网(https://dev.mysql.com/downloads/mysql/5.7.html#downloads)下载 . 我的选择如上图. 2.下载 ...
- luoguP2590 [ZJOI2008]树的统计(树链剖分)
luogu P2590 [ZJOI2008]树的统计 题目 #include<iostream> #include<cstdlib> #include<cstdio> ...
- 物流运输(最短路+dp)
这道题是相当的火,但是在tyher的讲解下我一遍就AC了!!! Part 1 理解题目 从第一天到最后一天,总会有一些点莫名其妙地走不了,所以导致我们不能按照上一次的最短路一直运输得到最少费用,而需要 ...
- CVE-2013-2094 porting to x86-32 分析
/* * linux 2.6.37-3.8.8 - x86 * @rikiji * * requires System.map and /dev/ptmx * this: http://zmbs.ne ...
- APM-全链路追踪
1.故障快速定位 跨语言实现开发中在业务日志中添加调用链ID,可以通过调用链结合业务日志快速定位错误信息. 2.各个调用环节的性能分析 分析调用链的各个环节耗时,分析系统的性能瓶颈,找到系统的薄弱环节 ...
- 【彩彩只能变身队(第七组)】Beta版本
本篇博客包括前期博文汇总.任务墙.团队管理细节与交流细节.代码管理.Beta阶段冲刺.团队总结.用户使用报告.Postmortem报告. 服务器网址:http://47.106.227.154/ 彩彩 ...
- 微信小程序(18)-- 自定义头部导航栏
最近做的项目涉及相应的页面显示相应的顶部标题,所以就需要自定义头部导航了. 首先新建一个顶部导航公用组件topnav,导航高度怎么计算? 1.wx.getSystemInfo 和 wx.getSyst ...
- Vue-native绑定原生事件
首先介绍一下是什么意思: 意思就是当你给一个vue组件绑定事件时候,要加上native!如果是普通的html元素!就不需要 <div id = "app"> <m ...
- Linux --忘记root密码/su: Authentication failure
如果忘记了root用户的密码,或者su root的时候,提示:su: Authentication failure 那么,可以通过以下的方式来重新设置密码,而后,再尝试,那么就可以顺利su root了 ...
- [BZOJ3669] [NOI2004] 魔法森林 LCT维护最小生成树
题面 一开始看到这道题虽然知道是跟LCT维护最小生成树相关的但是没有可以的去想. 感觉可以先二分一下总的精灵数,但是感觉不太好做. 又感觉可以只二分一种精灵,用最小生成树算另一种精灵,但是和似乎不单调 ...