CCF201809-3 元素选择器(100分)文本处理
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF201809-3 元素选择器(100分)文本处理相关的知识,希望对你有一定的参考价值。
试题编号: 201809-3
试题名称: 元素选择器
时间限制: 1.0s
内存限制: 256.0MB
问题链接:CCF201809-3 元素选择器
问题简述:(略)
问题分析:文本处理问题,需要有好的数据表示,好的处理流程。
程序说明:程序主要使用string及其相关的类方法来实现,需要熟悉有关的类及其方法。
参考链接:(略)
题记:(略)
100分的C++语言程序如下:
/* CCF201809-3 元素选择器 */
#include <bits/stdc++.h>
using namespace std;
const int N = 100 + 1;
struct Element {
string label;
string id;
int lvl;
} e[N];
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(NULL);
cout.tie(NULL);
string s;
int n, m;
cin >> n >> m;
cin.get();
for (int i = 1; i <= n; i++) {
getline(cin, s);
int k = 0;
while (s[k] == '.') k++;
e[i].lvl = k / 2;
string label;
while (s[k] != ' ' && s[k])
label += s[k++];
transform(label.begin(), label.end(), label.begin(), ::tolower);
e[i].label = label;
if (k < (int)s.length()) {
string t;
while (s[++k]) t += s[k];
e[i].id = t;
}
}
for (int i = 1; i <= m; i++) {
vector<string> v;
string t;
vector<int> ans;
getline(cin, s);
stringstream ss(s);
while (ss >> t) v.push_back(t);
for (int j = 0; j < (int)v.size(); j++)
if (v[j][0] != '#')
transform(v[j].begin(), v[j].end(), v[j].begin(), ::tolower);
for (int j = n; j >= 1; j--)
if (e[j].id == v[v.size() - 1] || e[j].label == v[v.size() - 1]) {
int l = v.size() - 2, lvl = e[j].lvl;
for (int k = j; k >= 0 && l >= 0; k--) {
if (e[k].lvl < lvl) {
lvl = e[k].lvl;
if (e[k].id == v[l] || e[k].label == v[l]) l--;
}
}
if (l == -1) ans.push_back(j);
}
cout << ans.size();
for (int j = ans.size() - 1; j >= 0; j--)
cout << ' ' << ans[j];
cout << endl;
}
return 0;
}
以上是关于CCF201809-3 元素选择器(100分)文本处理的主要内容,如果未能解决你的问题,请参考以下文章