SDU月模拟题CSP201809-3元素选择器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路:
第一点,要不要建一颗树?==>可以但没必要,因为建树过程复杂(没有直接给出边,需要自己做)而且只有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分也没个例子,自己试不出来了,同学写的是分开处理,我听他的改过来,莫名其妙就成了…两者不应该等价吗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值