元素选择器的实现(C++)

元素选择器的实现(C++)_第1张图片
元素选择器的实现(C++)_第2张图片
元素选择器的实现(C++)_第3张图片
元素选择器的实现(C++)_第4张图片input

11 5
html
..head
....title
..body
....h1
....p #subtitle
....div #main
......h2
......p #one
......div
........p #two
p
#subtitle
h3
div p
div div p

output

3 6 9 11
1 6
0
2 9 11
1 11

简析:

这道题的题目很长,但是涅,明白它的中心意思。
开始输入一个n和一个m,n(相当于)表示n个目录,m相当于有m个需要查询目录。
接下来输出你的查询结果,如果没有这个目录就输出0,
如果有这个目录,因为标签不唯一,所以返回多个目录,输出目录的个数和这些目录的位置。
所以这道题需要注意的是当查询它的子目录时,比如A B,那么就要选择第一个A后面的那些B,如果是A A B,就要选择第二个A后面的B
然后那么解题,因为标签大小写不分,所以直接把它们全部换为小写,定义2个容器,一个用来存答案,为int类型。
另一个用来存字符串,定义为string类型
又..代表一个缩进,那么我们记录下每一行的缩进,对该字符串做记录,具体代码如下:

Codes

#include
#include
#include
#include
using namespace std;
int n,m;
string s;
struct ele{
	string tag,id;//标签 
	int sj;//缩进 
}e[110];
bool solve(ele x[],int &y,int &z,string str){
	for(int h=y;h>0;h--){
		if(x[h].sj<z){
			z=x[h].sj;y=h;
			if(str==x[h].tag||str==x[h].id) return true;
		}
	}
	return false;
}
int main(){
	cin>>n>>m;getchar();//n行,m条目录
	for(int i=1;i<=n;i++){
		getline(cin,s);
		int nsj=0,p0=0,p1=0;
		for(int j=0;j<s.size();j++){
			if(s[j]=='.') nsj++,p0++;
			else if(s[j]=='#') p1=j;
		}
		e[i].sj=nsj;
		if(p1==0){
			e[i].tag=s.substr(p0);
			e[i].id="";
		}
		else{
			e[i].tag=s.substr(p0,p1-p0-1);
			e[i].id=s.substr(p1);
		}
		//转换一下 
		for(int j=0;j<s.size();j++) s[j]=tolower(s[j]); 
	}
	for(int i=0;i<m;i++){
		char ch[110];
		vector<string> v0;vector<int> v1;
		gets(ch);char *sp=strtok(ch," ");
		while(sp){
			v0.push_back(sp);
			sp=strtok(NULL," ");
		}
		int tmp=v0.size();
		for(int j=0;j<tmp;j++)
			if(v0[j][0]!='#')
				for(int mj=0;mj<v0[j].size();mj++)
					v0[j][mj]=tolower(v0[j][mj]);
		for(int j=1;j<=n;j++){
			if(v0[tmp-1]==e[j].id || v0[tmp-1]==e[j].tag){
				int st=j,nsj=e[j].sj,l=tmp-2;
				while(l>=0){
					if(!solve(e,st,nsj,v0[l])) break;
					l--;
				}
				if(l<0) v1.push_back(j);
			}
		}
		cout<<v1.size();
		for(int j=0;j<v1.size();j++) cout<<" "<<v1[j];
		cout<<endl;
	}
	return 0;
}

你可能感兴趣的:(C++语言程序)