CF125B Simple XML 题解

Content

一个 \(\texttt{XML}\) 表格由多个形如 \(\texttt{<x>}\) 或者 \(\texttt{</x>}\) 的标签组成,其中 \(\texttt{x}\) 表示一个英文字母。

现在,给出一个长度为 \(s\)\(\texttt{XML}\) 表格(保证没有空格),请你按照 \(\texttt{XML}\) 表格的格式输出:

  • 前面应该有 \(2\times h\) 的空格缩进,其中 \(h\) 表示当前标签的级数。
  • 每一个形如 \(\texttt{<x>}\) 或者 \(\texttt{</x>}\) 的标签。

翻译者提示:如果对题意不理解,可以考虑一下 \(\texttt{C++}\) 中嵌套循环的格式。

数据范围:\(s\leqslant1000\)

Solution

具体的我就只能先解释到这里了,我尽力了qwq。

但如果能够看懂的话的话,我想这道题目应该不算太难吧。

其实就是相当于跟 \(\texttt{C++}\) 中的嵌套循环差不多啊,就是:

while(1) {
	for(int i = 1; i <= n; ++i) {
    	do {
        	xxx;
        } while();
	}
}

那应该就可以能够理解了。其实,形如 \(\texttt{<x>}\) 的操作相当于循环的开头,形如 \(\texttt{</x>}\) 的操作则就相当于结束当前循环了。

我们用一个变量来存储当前标签的级数,如果满足当前的标签中开始了循环,并且不会在下一步就结束当前循环,那么级数加 \(1\);如果满足当前操作中结束了循环,并且不会在下一步再开始循环,那么级数减 \(1\),剩余的根据条件输出就好了。

Code

根据笔者的判断,下面的代码是本题的核心,故只放出以下核心代码,其中:

  • \(a\) 表示读入的字符串。
  • \(cir\) 表示级数【单词 \(\texttt{circulation}\)(循环)的前三个字母】。
for(int i = 0; i < a.size(); (a[i + 1] == '/') ? i += 4 : i += 3) {
		for(int j = 1; j <= cir; ++j)
			printf("  ");
		for(int j = 0; j < ((a[i + 1] == '/') ? 4 : 3); ++j) {
			printf("%c",  a[i + j]);
		}
		puts("");
		if(a[i + 1] != '/' && a[i + 4] != '/')	cir++;
		else if(a[i + 1] == '/' && a[i + 5] == '/') cir--;
	}
posted @ 2021-12-23 20:20  Eason_AC  阅读(48)  评论(0)    收藏  举报