写了几个小时,一直没有找到哪里出错,只有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;
}