程序设计月模拟题(四)元素选择器(CSP201809-3)
解题思路及代码
首先创建节点类,用来存储每一层的节点,其中主要有标签属性和层数级。需要注意的是由于属性对大小写不敏感,所以读取后全部转为小写。在进行查询的时,将查询的字符串全部读入,首先判断个数,如果唯一则直接进行搜索定位。如果有多个,则从最后一个字母串(位置可能有多个)开始向前不断找上级字符串。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
const int maxn=105;
int n,m;
int tar;
string s;
vector<string> res;
vector<string> qus;
vector<int> ans;
struct Node
{
string lable,id;
int cnt;
}a[maxn];
void init()
{
for(int i=1;i<=n;i++)
{
getline(cin,s);
tar=0;
for(int j=0;j<s.length();j++)
{
if(s[j]=='.')
{
a[i].cnt++;
j++;
}
else if (s[j]=='#')
{
tar=1;
a[i].id.push_back('#');
}
else
{
if((tar==0) && s[j]!=' ')
{
if(s[j]>='A'&&s[j]<='Z')
s[j]=s[j]+32;
a[i].lable.push_back(s[j]);
}
else if((tar==1) && s[j]!=' ')
a[i].id.push_back(s[j]);
}
}
}
}
bool isMatch(int x)
{
int t=a[x].cnt,q=qus.size()-2;
for(int j=x-1;j>=0;j--)
{
if(a[j].cnt==t-1)
{
if(qus[q][0]!='#' && qus[q]==a[j].lable)
q--;
else if(qus[q][0]=='#' && qus[q]==a[j].id)
q--;
t=a[j].cnt;
if(q<0) return true;
}
}
return false;
}
void find()
{
string tmp;
int index;
for(int i=1;i<=m;i++)
{
res.clear();
ans.clear();
qus.clear();
getline(cin,s);
for(int j=0;j<s.length();)
{
index=j;
while(++index < s.length() && s[index]!=' ');
tmp=s.substr(j,index-j);
if(tmp[0]!='#')
{
for(int i=0;i<tmp.length();i++)
if(tmp[i]>='A'&&tmp[i]<='Z')
tmp[i]=tmp[i]+32;
}
qus.push_back(tmp);
j=index+1;
}
int size=qus.size();
for(int j=1;j<=n;j++)
{
if(qus[size-1][0]=='#'&&qus[size-1]==a[j].id||qus[size-1][0]!='#'&&qus[size-1]==a[j].lable)
{
if(size==1) ans.push_back(j);
else if(isMatch(j)) ans.push_back(j);
}
}
cout<<ans.size();
for(int j=0;j<ans.size();j++)
cout<<" "<<ans[j]; //输出
cout<<endl;
}
}
int main()
{
cin>>n>>m;
getchar();
init();
find();
return 0;
}