CCF 元素选择器 80分解答

11 篇文章 0 订阅

写了几个小时,一直没有找到哪里出错,只有80分,希望大佬可以指点一下

大致思路

有一个Node的结构题,有id,label, rank就是层数组
分为单个匹配和多行匹配,用一个nodes数组来表示层数,如果是多行匹配,则去寻找nodes[j].rank == nodes[i].rank - 1
学习大佬的【CCF 201809-3】元素选择器

#include <stdio.h> 
#include <string> 
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Node {
public:
    int rank;
    string label;
    string id; 
};

const int maxn = 105;
Node nodes[maxn];

void findEle(string line, int num) {

    int rightp = line.rfind(' '), i = 0, j;
    // cout << line << endl;
    vector<int> v;
    // 说明只有一个单词 
    if (rightp == string::npos) {
        // 小写
        if (line[0] != '#') {
            transform(line.begin(), line.end(), line.begin(), ::tolower);
        }
        for(i = 1; i <= num; ++i) {
            if ( (line[0] == '#' && nodes[i].id == line)
                || nodes[i].label == line) {
                v.push_back(i);
            }
        }
    } else {
        vector<string> sv;
        string label, sub;
        while (rightp != string::npos) {
            sub = line.substr(rightp + 1);
            if (sub[0] != '#') {
                transform(sub.begin(), sub.end(), sub.begin(), ::tolower);
                // transform(line.begin(), line.end(), line.begin(), ::tolower);
            }
            sv.push_back(sub);
            line = line.substr(0, rightp);
            rightp = line.rfind(' ');
            if (rightp == string::npos){
                if (line[0] != '#') {
                    transform(line.begin(), line.end(), line.begin(), ::tolower);
                }
                sv.push_back(line);
            } 
        }
        for (i = 1; i <= num; ++i){
            int k = i ;
            j = 0;
            bool flag = true;
            if ( (sv[j][0] == '#' && sv[j] == nodes[k].id) ||
                    nodes[k].label == sv[j]) {
                for (j = 1; j < sv.size(); ++j) {
                    int rank = nodes[k].rank;
                    while (k > 0 && nodes[k].rank  != rank -1) {
                        --k;
                    }
                    if (sv[j][0] == '#')
                        label = nodes[k].id;
                    else 
                        label = nodes[k].label;
                    if (k <= 0 || label != sv[j]) {
                        flag = false;
                        break;
                    }
                }
            } else flag = false;
            // 满足
            if (flag) 
                v.push_back(i);
        }
    }
    vector<int>::iterator it = v.begin();
    cout << v.size();
    for (;it != v.end(); ++it) {
        cout << " " << *it;
    }
    cout << endl;
}

int main() {
    string line;
    int m, n;
    cin >> m >> n;
    getline(cin, line); // 除去空格
    string label, id;

    for (int i = 1; i <= m; ++i) {
        getline(cin, line);
        int level = 0, rank;
        for (; level < line.size() && line[level] == '.';++level);
        rank = level / 2;

        // 获取label, id 
        if (level > 0)
            line = line.substr(level);
        int leftp = line.find(' ');
        
        if (leftp != string::npos) {
            label = line.substr(0, leftp);
            id = line.substr(leftp + 1);
        } else {
            id = "";
            label = line;
        }
        nodes[i].id = id;
        transform(label.begin(), label.end(), label.begin(), ::tolower);
        // toLow(label);
        nodes[i].label = label;
        nodes[i].rank = rank;
    }

    for (int i = 1; i <= n; ++i) {
        getline(cin, line);
        // cout << "get line: " << line << endl;
        findEle(line, m);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值