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子元素选择器和后代选择器在功能描述上非常相同,但是他们其实是有区别的,本文章通过两个简单的实例向大家介绍子元素选择器与后代选择器的区别,需要的朋友可以参考一下. 首先我们来了解一下子元素选择器与 ...
随机推荐
- spring-第二篇ApplicationContext国际化及事件机制
1.ApplicationContext接口获取spring容器 ApplicationContext是BeanFactory接口的子接口,BeanFactory的常用实现类是Default ...
- HDU 1255 覆盖的面积 ( 扫描线 + 离散 求矩阵大于k次面积并 )
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- NGUI的button的创建的问题(Button Script)
一,我们可以给了label,sprite等添加button事件 我们先添加一个label在UI_Root上,然后选中该label,右键-Attach-Box Collider,添加,当你添加完了Box ...
- Spring Data Redis实战之提供RedisTemplate
参考: http://www.cnblogs.com/edwinchen/p/3816938.html 本项目创建的是Maven项目 一.pom.xml引入dependencies <depen ...
- zabbix入门之监控MySQL
zabbix入门之监控MySQL 这里使用的是zabbix官方自带的MySQL监控模板. 首先确保在被监控主机安装zabbix-agent.zabbix-sender,并且将主机加入监控节点.具体操作 ...
- Codeforces 735E 树形DP
题意:给你一棵树,你需要在这棵树上选择一些点染成黑色,要求染色之后树中任意节点到离它最近的黑色节点的距离不超过m,问满足这种条件的染色方案有多少种? 思路:设dp[x][i]为以x为根的子树中,离x点 ...
- React 和 Vue 到底谁更牛?听听尤雨溪怎么说
React 和 Vue 到底谁更牛?听听尤雨溪怎么说 知乎上近日有人发起了一个 “react 是不是比 vue 牛皮,为什么?” 的问题,再度引发一场关于前端框架谁更牛的口水战,评论里可以说是撕得不可 ...
- spark 计算结果写入mysql 案例及常见问题解决
package com.jxd import org.apache.spark.SparkContextimport org.apache.spark.SparkConfimport java.sql ...
- sql语句中判断空值的函数
COALESCE()函数 主流数据库系统都支持COALESCE()函数,这个函数主要用来进行空值处理,其参数格式如下: COALESCE ( expression,value1,value2……,v ...
- poj 2104: K-th Number 【主席树】
题目链接 学习了一下主席树,感觉具体算法思路不大好讲.. 大概是先建个空线段树,然后类似于递推,每一个都在前一个“历史版本”的基础上建立一个新的“历史版本”,每个历史版本只需占用树高个空间(好神奇!) ...