SP3310 SERIALN - Serial Numbers
题目描述
某制造商使用一张由序列号范围及其对应的状态码、转移码组成的有序表格来管理序列号。这个表格共四列,按以下顺序储存信息:起始序列号、结束序列号、状态码、转移码。序列号和转移码是介于 1 和 $2^{31} - 1$(即 2147483647)之间的整数,而状态码是一个大写字母。表格按照序列号递增的顺序维护,不能出现序列号范围重叠,并且任何序列号都必须在表中准确体现其最新的状态码和转移码。
假设创建了 100,000 个状态为 "A" 且转移码为 1 的序列号,它们的记录可以表示为:
```
1 100000 A 1
```
显然,这种方式比存储 100,000 行相同状态和转移码的数据更加高效。当需要在已定义的序列号范围中为部分序列号更新状态或转移码时,就会出现问题。例如,如果序列号 12345 需要更新为状态 B,原表需要调整为以下三条记录:
```
1 12344 A 1
12345 12345 B 1
12346 100000 A 1
```
接下来,如果我们把序列号范围 12000 到 12999 的转移码改为 2,则会得到:
```
1 11999 A 1
12000 12344 A 2
12345 12345 B 2
12346 12999 A 2
13000 100000 A 1
```
然后,将序列号范围 10000 到 100000 的所有状态更新为 C 且转移码更新为 2:
```
1 9999 A 1
10000 100000 C 2
```
一旦创建,序列号将永远保留,但可能会存在未定义序列号的区间。比如,可以将 1000000 到 1999999 之间的序列号设置为状态 Z 和转移码 99:
```
1 9999 A 1
10000 100000 C 2
1000000 1999999 Z 99
```
最后,表格始终维持在最少的行数,这意味着表中绝不会有两个可以合并为一行的相邻行。例如,以下表格:
```
1 10 A 1
11 20 A 1
21 30 B 1
```
前两行可以合并,因此它不是最优表格形式。最少行数的表示如下:
```
1 20 A 1
21 30 B 1
```
而下例由于非连续转移码,目前已是最小行数表示:
```
1 10 A 1
11 20 A 2
21 30 B 1
```
同样,以下表格也无法再简化,因为前两行不连续:
```
1 10 A 1
12 20 A 1
21 30 B 1
```
输入格式
每个输入案例以一个字符串命名,并且该字符串最多包含 80 个字符。"END" 表示输入结束。接下来是 1 到 100 行形式如 "A B S T" 的数据,其中 A、B 和 T 是 1 到 $2^{31} - 1$ 范围内的整数,S 是一个大写字母,且 A ≤ B。这些是要依次应用的序列号变更记录,其中 A 是序列号起始,B 是结束,S 是状态码,T 是转移码。一个仅包含数字 0 的行表示记录的结束。
输出格式
对于每个输入案例,先输出测试案例的名称,随后是所有序列号变更后,以最少行数表示的序列号表格。
**本翻译由 AI 自动生成**