<h3>题目背景</h3><p>层叠样式表(Cascading Style Sheets,简写 CSS)是一种用来为结构化文档(如 HTML 文档)添加样式(字体、间距和颜色等)的计算机语言。</p><p>例如,对于以下的 HTML 文档:</p><pre><code ><html>
<head>
<title>Sample</title>
</head>
<body>
<h1>Hello</h1>
<p id="subtitle">Greetings</div>
<p>Hello, world!</p>
</body>
</html>
</code></pre><p><span style="color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);">配合以下 CSS 片段可以为其中的标题和段落设置相应的格式:</span></p><pre><code >h1 { font-weight: bold; }
#subtitle { font-size: 12px; }
</code></pre><p>这段 CSS 片段为前面 HTML 文档添加了样式,使得标题“Hello”(第 6 行 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code><h1></code></span> 和 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code></h1></code></span> 标签之间的内容)具有粗体,使得段落“Greetings”(第 7 行 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code><p id="subtitle"></code></span> 和 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code><\p></code></span> 标签之间的内容)具有 12 个像素的字体大小。 这里,CSS 片段第 1 行中出现的 h1 是一个选择器,它选中了 HTML 文档第 6 行的 h1 元素。 CSS 片段第 2 行中出现的 #subtitle 也是一个选择器,选中了 HTML 文档第 7 行 id 属性为 subtitle 的 p 元素。 注意它并没有选中 HTML 文档第 8 行不带属性的 p 元素。</p><h3>题目描述</h3><p>本题要实现一个简化版的元素选择器。 给出一个结构化文档,和若干个选择器,对每个选择器找出文档中所对应选中的元素。</p><h4>结构化文档</h4><p>结构化文档由元素组成,一个元素可以包含若干个子元素(可以没有)。 一个文档有一个根元素,在整体上形成树的结构。 以下是本题结构化文档的一个例子:</p><pre><code >html
..head
....title
..body
....h1
....p #subtitle
....div #main
......h2
......p
</code></pre><ul><li>文档中每行表示一个元素,元素的标签由一个或者多个字母或数字组成。</li><li>元素可以附加一个 id 属性,属性值也是由一个或者多个字母或数字组成,之前有一个井号 #。如果元素有 id 属性,标签和属性之间用一个空格字符分隔。</li><li>标签之前的缩进表示元素之间的包含关系:一个元素 E 所在行之后连续的缩进更深的行代表的元素是元素 E 的后代元素,其中缩进恰好深一层的是元素 E 的子元素。为了便于观察,每一级缩进用两个小数点符号 .. 表示。</li></ul><h4>选择器</h4><p>本题中会出现的选择器有三种,分别为:</p><ul><li>标签选择器:用标签来表示。例如 p 表示选择标签为 p 的所有元素。</li><li>id 选择器:用 id 属性来表示。例如 #main 表示选择 id 属性为 main 的所有元素。</li><li>后代选择器:复合表达式,格式为 A B,其中 A 和 B 均为标签选择器或 id 选择器,中间用一个空格字符分隔,表示选择满足选择器 B 的所有元素,且满足这些元素有祖先元素满足选择器 A。例如,选择器 div p 在上面的文档中会选中最后一行的元素 p,但不会选中 id 属性为 subtitle 的那个元素 p。注意,后代选择器可以有更多的组成部分构成。</li></ul><h3>输入格式</h3><p>输入第一行是两个正整数 n 和 m,分别表示 HTML 文档的行数,和待查询的 CSS 选择器的个数,中间用一个空格字符分隔。</p><p>第 2 行至第 n+1 行给出 HTML 文档。</p><p>第 n+2 行至第 n+m+1 行每行给出一个待查询的 CSS 选择器。记第 n+1+i 行的 CSS 选择器为si,1≤i≤m。</p><p>保证输入的结构化文档和待查询的选择器都是合法的。</p><h3>输出格式</h3><p>输出共 m行,每行有若干个整数。</p><p>第 i 行表示选择器 si 选中的结果(1≤i≤m )。 其中第一个整数 ri 表示 si 选中的元素个数。 随后 ri 个整数,分别表示选中元素在结构化文档中出现的行号(行号从 1 开始编号)。</p><p>行号按从小到大排序,相邻整数之间用一个空格字符分隔。</p><h3>样例解释</h3><p>对丁样例中查询的5个选择器:</p><ol><li><span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span>选中所有的元素<span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span>;</li><li><span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>#subtitle</code></span> 选中第 6 行 id 属性为 subtitle 的元素 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span>;</li><li>由于没有标签为 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>h3</code></span> 的元素,因此 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>h3</code></span> 没有选中任何元素;</li><li>第 9 行和第 11 行的 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span> 元素都有祖先是 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>div</code></span> 元素,而第6行的 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span> 元素没有祖先是 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>div</code></span> 元素;</li><li><span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>div div p</code></span>要求选中的<span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span> 元素有两级祖先都是 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>div</code></span> 元素,只有第 11 行的<span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span>元素满足这个条件。</li></ol><h3>数据规模和约定</h3><ul><li>1≤n≤100</li><li>1≤m≤10</li><li>结构化文档和待查询的选择器每行长度不超过 80个字符(不包括换行符)。保证输入的结构化文档和待查询的选择器都是合法的。</li></ul><p><img src="https://kaoji100.com/images/578/3-1.png" alt="" data-href="" style=""/></p><h3>提示</h3><p>多级的后代选择器在匹配时,可以采用贪心的策略:除最后一级外,前面的部分都可以尽量匹配层级小的元素。</p>
用C++解决
最新发布