P7964 [COCI2021-2022#2] Kaučuk 题解

这道题就是大模拟。

直接模拟三层标题,为了方便,可以使用结构体。

三层标题套在一起,一定要细心,很容易出错。

如果直接三维存字符串可能会爆空间,题目中 \(n\) 只有 \(100\),开一个字符串数组存标题,三维存标题数组下标,空间就不会爆。

用一个结构体 \(nod\) 存一个二级标题以及子三级标题,其中 \(s3z\) 表示三级标题数量,数组 \(s3\) 存三级标题。

用一个结构体 \(node\) 存一个一级标题以及子二级标题,其中 \(s2z\) 表示二级标题数量,数组 \(s2\) 存二级标题。

变量 \(az\) 表示一级标题数量,变量 \(sz\) 表示所有标题数量。

注意结构体里存的标题都是标题数组 \(s\) 的下标。

#include <bits/stdc++.h>
using namespace std;
struct nod{
	int s2, s3z; 
	int s3[101];
};
struct node{ 
	int s1, s2z;
	nod s2[101];
}a[101];
int n, az, sz; 
string s[101];
int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; i++) {
		string as, bs;
		cin >> as >> bs;
		s[++sz] = bs; //先入标题数组,++sz表示先把大小加1,在存标题,下同。
		if(as == "section") a[++az].s1 = sz; 
		else if(as == "subsection") a[az].s2[++a[az].s2z].s2 = sz; //a[az].s2z是当前二级标题
		else a[az].s2[a[az].s2z].s3[++a[az].s2[a[az].s2z].s3z] = sz; //a[az].s2z是当前二级标题,a[az].s2[a[az].s2z].s3z是当前三级标题
	}
	for(int i = 1; i <= az; i++) { //逐级输出
		cout << i << " " << s[a[i].s1] << endl;
		for(int j = 1; j <= a[i].s2z; j++) {
			cout << i << "." << j << " " << s[a[i].s2[j].s2] << endl;
			for(int k = 1; k <= a[i].s2[j].s3z; k++) cout << i << "." << j << "." << k << " " << s[a[i].s2[j].s3[k]] << endl;
		}
	}
	return 0;
} 
上一篇:JavaScript-深拷贝函数的实现


下一篇:c++ string 删除第一个字符_字符串操作的全面总结