P7964 Kaučuk 题解

  1. 1. Solution

好久没有写题解了,社贡掉的太低了,就来写入门题解了

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