题目:元素选择器
题意:
输入:
输出
样例:
解题思路:这个题看着很复杂,其实就是从下网上搜索,该题给出的数据也不是很强,完全可以暴力搜索;找到给出的例子的最后一个字符串,之后对整个表从头到尾搜,搜到一个该字符串就向上搜索,看看是不是满足条件;记得无论是输入的表还是询问的问题,都要把非标签的字符串转化为统一格式,不然90分;我就是忘了转化问题的大小写导致一直90。。。
代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
int n,m,k=0;
struct node
{
string id;
string label;
int level;
}e[10005];
bool solve(int t,vector<string> x)
{
int flag=0;
int level=e[t].level;
x.pop_back();
if(x.size()==0)return true;
for(int i=t-1;i>=0;i--)//从下向上搜索(数据比较水,不用管叔辈)
{
if((e[i].label==x[x.size()-1]&&x[x.size()-1][0]!='#')||(e[i].id==x[x.size()-1]&&x[x.size()-1][0]=='#'))
{
if(e[i].level<level)
{
if(x.size()==1)
{
flag=1;
break;
}
level=e[i].level;
x.pop_back();
}
}
}
if(flag)
{
return true;
}
return false;
}
void sol(string t)
{
string s="";
int h=0;
vector<string> x;
vector<int> x1;
int flag=0;
while(h<t.size())//字符串的分离
{
if(t[h]=='#')
{
flag=1;
}
if(flag==0&&'A'<=t[h]&&t[h]<='Z')//大小写转化
{
t[h]+=32;
}
if(t[h]==' ')
{
x.push_back(s);
s="";
h++;
flag=0;
continue;
}
s+=t[h];
h++;
}
if(!s.empty())
x.push_back(s);
for(int i=0;i<n;i++)//找到就进行判定
{
if(e[i].label==x[x.size()-1]||e[i].id==x[x.size()-1])
{
if(solve(i,x))
{
x1.push_back(i+1);
}
}
}
cout<<x1.size();
for(int i=0;i<x1.size();i++)
{
cout<<" "<<x1[i];
}
cout<<endl;
}
int main()
{
cin>>n>>m;
int r1=n,r2=m;
char d=getchar();
while(r1--)
{
string t;
getline(cin,t);
string s="";
int i;
int total=0;
for(i=0;i<t.size()&&t[i]!=' ';i++)//大小写转化
{
if(t[i]!='.')
{
if('A'<=t[i]&&t[i]<='Z')
{
t[i]+=32;
}
s+=t[i];
}else
{
total++;
}
}
i++;
e[k].level=total;
e[k].label=s;
s="";
for(i;i<t.size();i++)
{
s+=t[i];
}
e[k].id=s;
k++;
}
while(r2--)
{
string t;
getline(cin,t);
sol(t);
}
}