CCF CSP刷题—元素选择器

在这里插入图片描述代码:

#include<iostream>
#include<string>
using namespace std;

struct tag {
	char * name;
	char * id;
	int line;
	int level;
	tag * father;
}; 

int main() {
	int n = 0;
	int m = 0;
	cin >> n >> m;

	char * nouse = new char[80];
	cin.getline(nouse, 80);
	char ** doc = new char*[n];
	for (int i = 0; i < n; i++)
		doc[i] = new char[80];
	for (int i = 0; i < n; i++)
		for (int j = 0; j < 80; j++)
			doc[i][j] = '\0';
	for (int i = 0; i < n; i++) {
		cin.getline(doc[i], 80);
	}

	char ** selector = new char*[m];
	for (int i = 0; i < m; i++)
		selector[i] = new char[80];
	for (int i = 0; i < m; i++)
		for (int j = 0; j < 80; j++)
			selector[i][j] = '\0';
	for (int i = 0; i < m; i++) {
		cin.getline(selector[i], 80);
	}
	tag ** docs = new tag*[n];
	for (int i = 0; i < n; i++) {
		docs[i] = new tag();
		int point = 0;//记录点的个数,可推算标签的级别
		int x = 0;
		int j = 0;
		char * temp = new char[80];
		while (doc[i][j] == '.') {
			point++;
			j++;
		}
		while (doc[i][j] != '\0') {
			temp[x++] = doc[i][j];
			j++;
		}
		temp[x] = '\0';
		j = 0;
		char * name = new char[80];//保存标签名
		int a = 0;
		char * id = new char[80];//保存标签id
		int b = 0;

		bool hasId = false;//用于记录该标签是否具有id属性

		//判断该结构化文档是否具有id属性
		for (j = 0; temp[j] != '\0'; j++) {
			if (temp[j] == '#') {
				hasId = true;
				break;
			}
		}
		x = 0;
		if (hasId==true) {
			//如果有id属性,则需要把id和标签名分别存储,两者以空格分隔
			while (temp[x] != ' ') {
				name[a++] = temp[x];
				x++;
			}
			name[a] = '\0';
			x = x + 2;
			while (temp[x] != '\0') {
				id[b++] = temp[x];
				x++;
			}
			id[b] = '\0';
			docs[i]->id = id;
		}
		else {
			//如果没有id,则整个都是标签名
			while (temp[x] != '\0') {
				name[a++] = temp[x++];
				
			}
			name[a] = '\0';
			docs[i]->id = NULL;
		}
		docs[i]->line = i + 1;
		docs[i]->level = point / 2;
		docs[i]->name = name;
	}
	//找到每个结点的父结点
	docs[0]->father = NULL;
	for (int i = 1; i < n; i++) {
		for (int j = i-1; j >= 0; j--) {
			if (docs[j]->level == docs[i]->level - 1) {
				docs[i]->father = docs[j];
				break;
			}
		}
	}
	//处理选择器
	for (int i = 0; i < m; i++) {
		int count = 0;//记录个数
		int * result = new int[100];//记录行数
		int b = 0;
		int x=0;
		//判断选择器的类型
		if (selector[i][0] == '#') {
			//是id选择器
			char * id = new char[80];
			int a = 0;
			x = 1;
			while (selector[i][x] != '\0') {
				id[a++] = selector[i][x++];
			}
			id[a] = '\0';
			for (int j = 0; j < n; j++)
			{
				if (docs[j]->id != NULL) {
					if (strcmp(docs[j]->id, id) == 0) {
						result[b] = docs[j]->line;
						b++;
						count++;
					}
				}
				
			}
		}
		else {
			//判断该选择器有多少层
			int blank = 0;
			for (int j = 0; selector[i][j] != '\0'; j++) {
				if (selector[i][j] == ' ')
					blank++;
			}
			char ** tags = new char*[blank + 1];
			x = 0;
			for (int j = 0; j < blank + 1; j++) {
				tags[j] = new char[80];
				int a = 0;
				while (selector[i][x] != ' '&&selector[i][x]!='\0') {
					tags[j][a] = selector[i][x];
					a++;
					x++;
				}
				tags[j][a] = '\0';
				x++;
			}
			int k = blank;
			b = 0;
			int z = 0;
			for (int j = 0; j < n; j++) {
				if (strcmp(tags[blank],docs[j]->name)==0) {
					if (blank == 0) {
						count++;
						result[b++] = docs[j]->line;
					}
					else {
						tag * temp = docs[j]->father;
						for (k = blank - 1; k >= 0; k--) {
							if (strcmp(temp->name,tags[k])==0) {
								temp = temp->father;
							}
							else
								break;
						}
						if (k==-1) {
							count++;
							result[b++] = docs[j]->line;
						}
					}
				}
			}

		}if (count == 0)
			cout << count << endl;
		else {
			cout << count<<" ";
			if (count >= 1) {
				for (int j = 0; j < count - 1; j++) {
					cout << result[j] << " ";
				}
				cout << result[count - 1] << endl;
			}
		}
	}
	return 0;
}

程序还是有问题…在OJ上总是编译错误,但是在vs上是没问题的。不知道哪里有问题??!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值