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子元素选择器和后代选择器在功能描述上非常相同,但是他们其实是有区别的,本文章通过两个简单的实例向大家介绍子元素选择器与后代选择器的区别,需要的朋友可以参考一下. 首先我们来了解一下子元素选择器与 ...
随机推荐
- Tcp协议介绍
前情提要:根据域名建立tcp链接之前要做两件事情,1 根据arp协议找到网管mac地址 2 通过dns服务器解析出域名的Ip地址,解析出域名的Ip地址之后就可以建立tcp链接了. tcp协议三个特点: ...
- [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1030 最最最常见的多串匹配问题!题目求至少包含一个子串的方案数,则可以转化成全部方案-不 ...
- javaScript--基础 选择结构
2.短路现象--扩展 当 true 遇到 || , true || 表达式不执行, 右侧的表达式不执行 当false 遇到 && , false && 表达式不 ...
- quota - 显示磁盘的使用和限额
总览 (SYNOPSIS) quota [ -guv | q ] quota [ -uv | q ] user quota [ -gv | q ] group 描述 (DESCRIPTION) Quo ...
- DB count check for TABLES VIEWS PROCEDURES TRIGGERS
SELECT DISTINCT(TABLESPACE_NAME) FROM ALL_TABLES; SELECT COUNT(*) FROM ALL_TABLES where TABLESPACE_N ...
- MAT in eclipse - memory analyzer
In Help > Install New Software..., enter the following update site URL: http://download.eclipse.o ...
- c++消息中间件
ZeroMQ ActiveMQ-CPP 另外 ZeroMQ 的作者用 C 重构了一套.改名叫:nanomsg ZeroMQ:https://www.cnblogs.com/rainbowzc/p/33 ...
- Java实现sock5代理服务器
入职练手socks5代理服务器,过程总结一下. 1.下载火狐浏览器,设定代理为socks5代理,地址为127.0.0.1:1080. 2.socks5协议1928,中文版,原版,认真阅读 3.按照协议 ...
- PCB设计规则中英文对照
Electrical(电气规则) Clearance:安全间距规则 Short Circuit:短路规则 UnRouted Net:未布线网络规则 UnConnected Pin:未连线引脚规则 Ro ...
- 前端每日实战:76# 视频演示如何用纯 CSS 创作一组单元素办公用品(内含2个视频)
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oMgmwB 可交互视频 此视频是可 ...