姜郎财尽 2023-11-21 03:11 采纳率: 50%
浏览 9
已结题

CSP认证:201809-3 元素选择器

CSP认证考试:
201809-3 元素选择器
虽然自己测试的时候都是对的,但只能得标签的四十分,带id和后代选择器的都错了,实在不能理解。

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node{
    string name;
    string id;
    int line;
    int level;
    vector<node*>son;
    node *mother;
};
vector<vector<int>> ans;
//
string lower(string a){
    int length=a.size(); 
    for(int i=0;i<length;i++){
        if(a[i]>='A' && a[i]<='Z'){
            a[i]=a[i]+'a'-'A';
        }
    }
    return a;
}
//
int cmp(int a,int b){
    return a<b;
} 
//
void find(vector<int>&ans2,node* head,vector<string>&S,int now){
    int length=head->son.size(); 
    for(int i=0;i<length;i++){
        if( lower(head->son[i]->name)==lower(S[now]) ) {
            if(now==S.size()-1) ans2.push_back( head->son[i]->line );
            else find(ans2,head->son[i],S,now+1);
        }
        else if( head->son[i]->id==S[now] ){
            if(now==S.size()-1) ans2.push_back( head->son[i]->line );
            else find(ans2,head->son[i],S,now+1);
        }
        else{
            find(ans2,head->son[i],S,now);
        }
    }
}
//
int main(){
    cin>>n>>m;  
    getchar();
    node* head=new node;  head->name="原初";
    node* pre=new node;
    node* last_line=new node;//上一行 
    //
    for(int i=0;i<n;i++){
        string str;
        getline(cin,str);
        //读入了一句html 
        int level=0; 
        while(str[0]=='.') {
            level++;
            str.erase(str.begin());
        }
        level=level/2+1;
        //知道了分级是多少 
        node* temp=new node;
        temp->level=level;
        if(level==1){//等级为1,开启新的族谱 
            temp->mother=head;
            head->son.push_back(temp);
            last_line=temp;
        }
        else if(last_line->level==level){
            temp->mother=last_line->mother;
            temp->mother ->son.push_back(temp);
            last_line=temp;
        }
        else if(last_line->level+1==level){
            temp->mother=last_line;
            temp->mother ->son.push_back(temp);
            last_line=temp;
        }
        else if(last_line->level > level){
            while(last_line->level >= level){
                last_line=last_line->mother;
            }
            last_line->son.push_back(temp);
            last_line=temp;
        }
        //确定该行的母亲,母亲认子 
        temp->line=i;
        int flag=0;
        for(int j=0;j<str.size();j++){
            if(str[j]==' '){
                flag=1;
                continue;
            }
            if(flag==0) {
                temp->name.push_back(str[j]);
            }
            else temp->id.push_back(str[j]);
        }
        //读入内容,都有name,但不一定有id 
    }
    //数据储存完成,分级完成,母子确认完成
    for(int i=0;i<m;i++){
        vector<string> S;
        string str;
        getline(cin,str);
        string con;
        for(int j=0;j<str.size();j++){
            if(str[j]==' '){
                S.push_back(con);
                con.clear();
                continue;
            }
            con.push_back(str[j]);
        }    
        S.push_back(con);
        //
        vector<int> ans2;
        find(ans2,head,S,0);
        ans.push_back(ans2);
    } 
    //
    for(int i=0;i<ans.size();i++){
        sort(ans[i].begin(),ans[i].end(),cmp);
        cout<<ans[i].size();
        for(int j=0;j<ans[i].size();j++){
            cout<<" "<<ans[i][j]+1;
        }
        if(i!=ans.size()-1)cout<<"\n";
    }
    return 0;
}


  • 写回答

14条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 11月29日
  • 赞助了问题酬金15元 11月21日
  • 创建了问题 11月21日

悬赏问题

  • ¥15 网友们我该怎么办啊,急
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 目标跟踪,计算机视觉
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
  • ¥200 C++表格文件处理-悬赏
  • ¥15 Windows Server2016本地登录失败
  • ¥15 复合卡卡号轨道写入芯片卡
  • ¥20 基于MATLAB的TDOA