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分)文本处理的主要内容,如果未能解决你的问题,请参考以下文章

CCF202006-3 Markdown渲染器(100分)文本处理

CSP201809-3 元素选择器

CSP201809-3 元素选择器

201809-3元素选择器

CCF-CSP题解 201709-3 JSON查询

CCF201909-3 字符画(100分)文本处理