CCF认证 201809-3元素选择器

大模拟

1、存储 2、查找

整体来看是树形结构

总结:


结构体建立

struct element{
    int father;
    string label,id;
};
vector<element> elements(105);

//级数另外存储
vector<vector<int>> series;
series[0][2]=3;表示行号为3的元素的级数为0  element[3]

读取输入

C++ getline函数读取一行字符串,行号(简单),级数(.),标签(截取),父元素(截取)

while(line[j]=='.') ++j;

//有下标为j/2的元素和没有下标为j/2的元素
if(series.size()<=j/2)  series.push_back({i});
else series[j/2].push_back(i);

//找到空格处
for(k=j;k<line.size()&&line[k]!=' ';++k);
substr(其实字符位置,截取字符个数)  line.substr(j,k-j);
                                  line.substr(k+1);

//父元素,当前元素的级数j/2,父元素为j/2-1的元素离他最近的一个
series[j/2-1].back();
elements[i].father=j/2-1<0?-1:series[j/2-1].back();

读取查询元素数据  vector<string> query

查找

vector<int> ans;对于后代选择器AB ,A是B的一个祖先元素不一定是父元素

查询选择器是vector<string> query ,包含元素数为query.size()  要从series[query.size()-1]到series末尾

找到B再判断祖先

for(int i=query.size()-1;i<series.size();i++){
    for(int j:series[i])
        if(elements[j].label==query.back()||elements[j].id==query.back()){
            int k=query.size()-2;
            for(int p=elements[j].father;k>=0&&p!=-1;p=elements[p].father)
                if(elements[p].label==query[k]||elements[p].id==query[k])
                    k--;
            if(k<0) ans.push_back(j);
        }
}
printf("%d ",ans.size());
for(auto i:ans)
    printf("%d ",i);
puts("");

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值