#HK4816. 「KTSC 2025 R1」桥梁维修工程

「KTSC 2025 R1」桥梁维修工程

注意事项

在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++(标准为 C++ 17 及以上)

请在提交源代码前添加 #include "roadwork.h"。

题目描述

题目译自 2025년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사 T3 「다리 보수 공사」

KOI 城市以一条横贯东西的大河为中心而建。河的北岸和南岸各分布着 NN 个村庄。北岸的村庄从下游向上游依次编号为 A1,A2,…,ANA_{1}, A_{2}, \ldots, A_{N},南岸的村庄同样从下游向上游依次编号为 B1,B2,…,BNB_{1}, B_{2}, \ldots, B_{N}。因此,KOI 城市总共有 2N2N 个村庄。

最初,KOI 城市的居民靠木筏往来交流,但随着现代化进程,他们开始修建跨越大河的桥梁。由于城市发展从下游开始,最早建成的桥梁连接了 A1A_{1} 和 B1B_{1},被居民称为 00 号桥。随后,KOI 城市陆续修建了 11 号桥、22 号桥,乃至 2N−22N-2 号桥,总共建成 2N−12N-1 座桥梁。

从 00 号桥开始,每座新桥都与前一座桥相邻修建。具体来说,对于任意 0≤i≤2N−30 \leq i \leq 2N-3,若 ii 号桥连接 AxA_{x} 和 ByB_{y},则 i+1i+1 号桥要么连接 AxA_{x} 和 By+1B_{y+1},要么连接 Ax+1A_{x+1} 和 ByB_{y}。这两种选择记录在一个长度为 2N−22N-2 的字符串 SS 中:若 S[i]=AS[i] = \texttt{A},则 i+1i+1 号桥连接 AxA_{x} 和 By+1B_{y+1};若 S[i]=BS[i] = \texttt{B},则连接 Ax+1A_{x+1} 和 ByB_{y}。字符串 SS 中恰好有 N−1N-1 个 A\texttt{A} 和 N−1N-1 个 B\texttt{B}。据此,可以证明以下事实:

  • 不会出现连接不存在村庄的桥梁。
  • 任意两个不同村庄之间总能通过桥梁往返。
  • 2N−22N-2 号桥必然连接 ANA_{N} 和 BNB_{N}。

现在,KOI 城市计划对桥梁进行维修工程。维修将从 2N−12N-1 座桥梁中挑选若干座进行。由于施工会产生噪音,城市希望避免同一村庄连接的两座或更多桥梁同时维修。你的任务是帮助 KOI 城市在满足这一条件的前提下,尽可能多地维修桥梁,并计算出能修最多桥梁时的方案数,对 109+710^{9}+7 取模后的余数。两个维修方案不同是指选中的桥梁集合不同。即使你只算出最多能修的桥梁数量,也能获得部分分数。

实现细节

你需要实现以下函数:

array<int, 2> roadwork(string S)
  • SS:长度为 2N−22N-2 的字符串。
  • 该函数在一个测试用例中可能被调用 TT 次。
  • 若最多能维修 pp 座桥梁,且维修 pp 座桥梁的方案数对 109+710^{9}+7 取模后为 qq,函数需返回 [p,q][p, q],其中 0≤q≤109+60 \leq q \leq 10^{9}+6。

你提交的代码中不得包含任何输入输出函数。

样例 1

假设 N=2N=2,S=ABS=\texttt{AB},评测程序调用:

roadwork("AB")

下图展示了 KOI 城市的结构。

此时,00 号桥连接 A1A_{1} 和 B1B_{1},11 号桥连接 A1A_{1} 和 B2B_{2},22 号桥连接 A2A_{2} 和 B2B_{2}。选择 00 号桥和 22 号桥维修,可修最多 22 座桥,且这种方案只有 11 种。函数应返回 [2,1][2,1]。若返回 [2,−1][2,-1] 或 [2,0][2,0] 等,仅正确返回数量,分数按部分计。

维修 11 座桥有 33 种方法,但这不是最多桥梁的情况,不予考虑。

样例 2

假设 N=7N=7,S=AABBAABBAABBS=\texttt{AABBAABBAABB},评测程序调用:

roadwork("AABBAABBAABB")

下图展示了 KOI 城市的结构。

此时,最多可维修 66 座桥,方案数有 44 种。函数应返回 [6,4][6,4]。

数据范围与提示

对于所有输入数据,满足:

  • 1≤T≤101 \leq T \leq 10
  • 2≤N≤2212 \leq N \leq 2^{21}
  • SS 中恰好包含 N−1N-1 个 A\texttt{A} 和 N−1N-1 个 B\texttt{B}。

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 44 N≤21N \leq 2^{1}
22 55 N≤23N \leq 2^{3}
33 66 N≤25N \leq 2^{5}
44 77 N≤27N \leq 2^{7}
55 88 N≤29N \leq 2^{9}
66 99 N≤211N \leq 2^{11}
77 1010 N≤213N \leq 2^{13}
88 1111 N≤215N \leq 2^{15}
99 1212 N≤217N \leq 2^{17}
1010 1313 N≤219N \leq 2^{19}
1111 1515 无附加限制

对于每个子任务,若仅正确返回最多桥梁数量,可获得 40%40\% 的分数。

示例评测程序

示例评测程序接收以下格式的输入:

  • 第 11 行:TT
  • 第 2+i2+i (0≤i≤T−1)(0 \leq i \leq T-1) 行:N SN\ S

设第 i+1i+1 个测试用例中 roadwork 返回的数组为 C[i]C[i],输出格式为:

  • 第 1+j1+j (0≤j≤T−1)(0 \leq j \leq T-1) 行:C[j][0] C[j][1]C[j][0]\ C[j][1]

请注意,示例评测程序可能与实际评测程序有所不同。