题目
题目大意
本题给出了一种目录结构,每个目录包含了两个属性,分别是label和id。另外每个目录有一定级层,可以用之前的省略号数目来表示层级。题目会给出三种寻找方式,要求我们找到满足条件的目录数目及其编号。三种方式分别是label寻找和id寻找和后代选择器,其中后代选择器给出了要求寻找的层级之上的一些约束。
解题思路
本题思路较为简单,首先用结构体来存储每个目录,其中存储了label和id以及层级数,另外还需要一个二维数组数组,key[i]存储第i层级所有目录编号。对于前两种查找只要对号放入答案数组即可,对于后代选择器,需要查找对应目录之上层级中是否包括后代选择器中对应的内容,这里只需要遍历key的各层寻找即可,总体来说思路比较简单。
具体代码
#include<iostream>
#include<sstream>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<map>
#define MAXN 100005
#define ll long long
using namespace std;
struct node{
int grade;
string label;
string id;
}s[101];
vector<int> key[101];
vector<int> ans[101];
bool same(string a,string b)//两个标签是否相等(大小写不敏感)
{
if(a.length()!=b.length()) return false;
for(int i=0;i<a.length();i++)
if(a[i]==b[i]) continue;
else if(a[i]==b[i]+'A'-'a') continue;
else if(b[i]==a[i]+'A'-'a') continue;
else return false;
return true;
}
int main()
{
memset(key,0,sizeof(key));
memset(ans,0,sizeof(ans));
int n,m;
cin>>n>>m;
getchar();
for(int i=1;i<=n;i++)
{
string str;
getline(cin,str);
int num=str.find('.');
while(str[num]=='.'||num==-1) num++;
s[i].grade = num/2;
key[s[i].grade].push_back(i);
if(str.find('#')!=-1)
{
s[i].id=str.substr(str.find('#'));
s[i].label=str.substr(num,str.find('#')-num-1);
}
else
{
s[i].id="";
s[i].label=str.substr(num);
}
}
for(int i=1;i<=m;i++)
{
string tmp;
getline(cin,tmp);
if(tmp.find('#')==-1&&tmp.find(' ')==-1)
{
for(int j=1;j<=n;j++)
if(same(tmp,s[j].label))
ans[i].push_back(j);
}
else if(tmp.find('#')!=-1&&tmp.find(' ')==-1)
{
for(int j=1;j<=n;j++)
if(tmp==s[j].id)
ans[i].push_back(j);
}
else //后代选择器
{
string str;
for(int j=1;j<=n;j++)
{
stringstream ss(tmp);
stack<string> temp;
int cnt=0;
while(ss>>str)
{
temp.push(str);
cnt++;
}
str=temp.top();temp.pop();
if(str.find('#')==-1&&!same(str,s[j].label)) continue;
else if(str.find('#')!=-1&&str!=s[j].id) continue;
int sum=0;
for(int p=s[j].grade-1;p>=0;p--)
{
str=temp.top();
if(str.find('#')==-1)
{
for(int q=0;q<key[p].size();q++)
{
if(same(str,s[key[p][q]].label))
{
sum++;
temp.pop();
break;
}
}
}
else
{
for(int q=0;q<key[p].size();q++)
{
if(str==s[key[p][q]].id)
{
sum++;
temp.pop();
break;
}
}
}
if(sum==cnt-1)
{
ans[i].push_back(j);
break;
}
}
}
}
}
for(int i = 1; i <= m; i++)
{
cout << ans[i].size() << " ";
for(int j = 0; j < ans[i].size(); j++)
{
cout << ans[i][j] << " ";
}
cout << endl;
}
}