思路:
第一点,要不要建一颗树?==>可以但没必要,因为建树过程复杂(没有直接给出边,需要自己做)而且只有100个,一个个查完全没问题。
第二点:三种选择器如何做,很明显三种实际上是两种(我认为其实是一种,但是这样做只有80分,至今也不知道问题在哪里),一种是单个的,一种是层级的,对于层级的,先找和最后一样的,然后一层层向上找。
第三点:id保留#,把它去了更麻烦,带着容易
//
// Created by haofeng on 6/5/20.
//
//id和label应该没有重复的
//m,n都很小,说明暴力即可完成==>wdnmd直接全来一遍呗,反正也是要全部的
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
int N,M;
int cnt=1;
vector<string> anc;
vector<string> req;
vector<int> ans;
struct node{
string label;//不敏感,转化成小写
string id;//敏感,用原本的,#作为开头
int cengji=0;//不记录父节点,因为有很好的方法去找,就是直接找上一个层级低的
};
node NODES[110];
void toLower(string &str){
for(int i=0;i<str.size();i++){
if(isalpha(str[i]))str[i]=tolower(str[i]);
}
}
bool canMatch(int x){
int t=NODES[x].cengji,q=req.size()-2; //t当前层级 q为req下标
for(int j=x-1;j>=0;j--){ //向上
if(NODES[j].cengji==t-1){
if(req[q][0]!='#'&&req[q]==NODES[j].label)
q--;
else if(req[q][0]=='#'&&req[q]==NODES[j].id)
q--;
t=NODES[j].cengji; //更新
if(q<0) return true; //所有都满足了
}
}
return false;
}
void inputnode(string str){
int lastdot=str.find_last_of('.');
int blank=str.find_first_of('#');//如果没有找到这个数会大得离谱
NODES[cnt].cengji=(lastdot+1)/2;
if(blank==-1) {
NODES[cnt].label=str.substr(lastdot+1,str.size());
NODES[cnt].id="";
}
else{
NODES[cnt].label=str.substr(lastdot+1,blank-lastdot-2);
NODES[cnt].id=str.substr(blank,str.size());
}
toLower(NODES[cnt].label);
cnt++;
}
int main(){
cnt=1;
string s;
cin>>N>>M;
getchar();
for (int i = 0; i < N ; ++i) {
getline(cin,s);
inputnode(s);
}
for (int i = 0; i < M; ++i) {
getline(cin,s);
stringstream ss;ss<<s;
string t;
while(ss>>t){
if(t[0]!='#')toLower(t);
req.push_back(t);
}
int si=req.size();
for (int j = 1; j <=N ; ++j) {
if(req[si-1][0]!='#'&&req[si-1]==NODES[j].label||req[si-1][0]=='#'&&req[si-1]==NODES[j].id) {
if (req.size() == 1){
ans.push_back(j);
}
else if (canMatch(j)) {
ans.push_back(j);
}
}
}
req.clear();
cout<<ans.size();
for (int k = 0; k <ans.size() ; ++k) {
cout<<" "<<ans[k];
}
cout<<endl;
ans.clear();
}
}
总结:这个题难点在多级上,我仍然认为只有一个元素可以认为是一层的多级,但是那20分也没个例子,自己试不出来了,同学写的是分开处理,我听他的改过来,莫名其妙就成了…两者不应该等价吗