大模拟
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("");