#P14612. [IATI2026 day2]evilution
[IATI2026 day2]evilution
题目描述
坏人们的 DNA 只由四种字符组成:A、C、G、T。
在第 0 天,坏人的 DNA 为字符串 S_0。之后每天,DNA 都会按照以下规则同时替换:
- 每个
A替换成字符串S_A - 每个
C替换成字符串S_C - 每个
G替换成字符串S_G - 每个
T替换成字符串S_T
其中 S_A, S_C, S_G, S_T 的长度都至少为 2。
现在有 Q 个询问。每个询问给出三个整数 K_i, L_i, R_i,你需要回答:
在第
K_i天的 DNA 串中,闭区间[L_i, R_i]内分别有多少个A、C、G、T?
也就是说,对于每个询问,你需要输出四个数,表示该区间中四种字符各自出现的次数。
实现要求
你需要实现如下函数:
std::vector<std::vector<long long>> solve(
std::string S_0,
std::vector<std::string> S_ACGT,
std::vector<long long> K,
std::vector<long long> L,
std::vector<long long> R
);
其中:
S_0:第0天的 DNAS_ACGT:长度为4的字符串数组,依次表示S_A, S_C, S_G, S_TK:所有询问中的第i个天数K_iL:所有询问中的左端点L_iR:所有询问中的右端点R_i
函数会被调用恰好一次。
它应返回一个长度为 Q 的二维数组,其中第 i 个元素是一个长度为 4 的数组,依次表示第 i 个询问中 A、C、G、T 的数量。
约束条件
记:
[ S = \max(|S_0|, |S_A|, |S_C|, |S_G|, |S_T|) ]
则有:
2 <= S <= 10^5- 所有字符串中的字符都只会是
A、C、G、T 1 <= Q <= 10^40 <= K_i <= 10^180 <= L_i <= R_i <= 10^18- 保证每个询问中,第
K_i天的 DNA 串至少包含下标从L_i到R_i的字符
子任务
| 子任务 | 分值 | 需要通过的前置子任务 | S |
Q |
K_i |
额外限制 |
|---|---|---|---|---|---|---|
| 0 | - | 样例 | ||||
| 1 | 7 | 0 | <= 5 |
<= 100 |
<= 10 |
无 |
| 2 | 6 | 0-1 | <= 6 |
<= 10^4 |
||
| 3 | 13 | 0-2 | <= 10^3 |
<= 50 |
||
| 4 | 10 | 0-3 | <= 10^5 |
|||
| 5 | 15 | 0-4 | <= 2 * 10^3 |
|||
| 6 | 7 | - | <= 10^18 |
L_i = R_i = 0 |
||
| 7 | 17 | 0-3 | <= 10^3 |
无 | ||
| 8 | 25 | 0-7 | <= 10^5 |
|||
只有当某个子任务及其要求的前置子任务全部通过时,才能获得该子任务的分数。
样例
输入
TAG
TGT
CGT
CCT
CGC
10
1 3 3
2 2 5
0 0 2
0 2 2
0 0 2
1 8 8
0 1 1
1 0 5
0 0 1
1 2 7
输出
0 0 0 1
0 2 0 2
1 0 1 1
0 0 1 0
1 0 1 1
0 0 0 1
1 0 0 0
0 2 2 2
1 0 0 1
0 3 1 2
样例说明
第 0 天、第 1 天、第 2 天的 DNA 分别为:
TAGCGCTGTCCTCGTCCTCGTCGCCCTCGCCGTCGTCGC
随后根据各个询问统计指定区间内 A、C、G、T 的个数即可。
本地评测器
输入格式
- 第
1至5行:依次为S_0, S_A, S_C, S_G, S_T - 第
6行:整数Q - 第
7行到第6 + Q行:每行三个整数K_i, L_i, R_i
输出格式
- 第
i行:四个整数,表示第i个询问返回的A, C, G, T数量