B. 代码对齐

    传统题 1000ms 256MiB

代码对齐

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

题目描述

实现一个代码列对齐功能,具体规则如下:

  1. 处理多行代码,每行由若干单词组成(单词间为一个或多个空格,行首/行尾可含空格),最终结果需去掉行首、行尾空格,单词顺序和行数保持不变。
  2. 第 11 列单词的起始位置固定为 11。
  3. 第 ii 列(i≥2i \ge 2)单词的起始位置 pip_i 取最小可能值,要求所有行的第 i−1i-1 列单词的结束位置,都 ≤pi−2\le p_i - 2。
  4. 最终每行的第 ii 列单词,都在统一的 pip_i 位置开始,仅保留对齐所需的必要空格,让整体代码最短。

输入格式

  • 输入包含 11 至 10001000 行代码,每行至少包含 11 个单词。
  • 单词长度为 1∼801 \sim 80 字符,可包含大小写字母、ASCII 33-126 的非空白字符。
  • 每行输入长度不超过 180180 字符,单词间由一个或多个空格分隔,行首、行尾可包含空格,所有行(含最后一行)均以换行符结束。

输出格式

  • 输出对齐后的代码,行数、单词顺序与输入完全一致,无行首、行尾空格。
  • 每行的第 ii 列单词必须在统一的 pip_i 位置开始,仅保留对齐必需的空格,使整体代码长度最短。

样例输入 1

  start:  integer;    // begins here
stop: integer; //  ends here
 s:  string;
c:   char; // temp

样例输出 1

start: integer; // begins here
stop:  integer; // ends   here
s:     string;
c:     char;    // temp

样例输入 2

a b c
aa bb cc
aaa bbb ccc
aaaa bbbb cccc

样例输出 2

a    b    c
aa   bb   cc
aaa  bbb  ccc
aaaa bbbb cccc

样例解释

样例 1 解释

  • 第 11 列单词分别为 start:、stop:、s:、c:,最长长度为 66,因此第 22 列起始位置 p2=6+2=8p_2 = 6 + 2 = 8。
  • 第 22 列单词分别为 integer;、integer;、string;、char;,最长长度为 88,因此第 33 列起始位置 p3=8+8+2=18p_3 = 8 + 8 + 2 = 18。
  • 第 33 列单词分别为 //、//、(无)、//,最长长度为 22,因此第 44 列起始位置 p4=18+2+2=22p_4 = 18 + 2 + 2 = 22。
  • 按上述 pip_i 对齐后得到输出,所有列均左对齐且仅保留必要空格。

样例 2 解释

  • 第 11 列最长单词为 aaaa(长度 44),故 p2=4+2=6p_2 = 4 + 2 = 6。
  • 第 22 列最长单词为 bbbb(长度 44),故 p3=6+4+2=12p_3 = 6 + 4 + 2 = 12。
  • 第 33 列最长单词为 cccc(长度 44),对齐后每行单词均从固定位置开始。

【算法解析与逻辑建模进阶】第 1 次随堂测验

未参加
状态
已完成
规则
乐多
题目
2
开始于
2026-3-15 18:10
结束时间
2026-3-15 18:30
持续时间
0.3 小时
主持人
参赛人数
34