好久没有写题解了,社贡掉的太低了,就来写入门题解了
Solution
观察题面,大模拟。
模拟思路,是维护三个变量 ,分别代表一级标题序号,二级标题序号以及三级标题序号。
代表到上一个父标题没有同级标题。
设当前的状态为标题的级别,
比如
1 2 3 4 5
| 1 asdf 2 ddd 3 kk 3.1 kkk 3.1.1 jfkjd
|
这样,在前三个时三个状态都为 ,第四个标题时状态为 ,第五个标题时状态为 。
在插入新标题时,
若当前状态对应的变量为 ,那么就要插入新的标题。这时,让这个状态变量设置为 ,表示当前级标题序号为 。
若当前状态对应的变量不为 ,那么说明前面有相同级别的标题,需要在后面接一个新序号的标题,那么这个变量就自增 。
操作完成后,直接输出三个序号即可。
举个例子:
1 2 3 4 5 6
| 5 section zivotinje 1 subsection macke 1.1 subsection psi 1.2 subsubsection mops 1.2.1 section asdfasdf 2
|
执行第四步时,需要在原来基础上增加一层标题,那么就要令 等于 。
执行第五步时,层数掉回了一级,那么在他之上就没有二级和三级标题了,就让 和 都设为 , 自增 。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include<bits/stdc++.h> using namespace std;
int main() { string p,ss; int n,f=-1,s=-1,t=-1; cin>>n; for(int i=1;i<=n;i++) { cin>>p>>ss; if(p=="section") { if(f==-1) f=1; else f++; s=-1,t=-1; printf("%d %s\n",f,ss.c_str()); } else if(p=="subsection") { if(s==-1) s=1; else s++; t=-1; printf("%d.%d %s\n",f,s,ss.c_str()); } else if(p=="subsubsection") { if(t==-1) t=1; else t++; printf("%d.%d.%d %s\n",f,s,t,ss.c_str()); } } return 0; }
|