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--;
}

浙公网安备 33010602011771号