AT_soundhound2018_summer_final_e Hash Swapping
题目描述
给定 $M$ 个仅由小写英文字母组成、长度为 $N$ 的字符串,记为 $S_1, S_2, \ldots, S_M$。请处理 $Q$ 个如下类型的查询:
- swap 查询($type = 1, x, y, l, r$):将 $S_x[l..r]$ 与 $S_y[l..r]$ 进行交换。
- hash 查询($type = 2, x, y = 0, l, r$):计算 $h(S_x[l..r])$ 并输出。
其中:
- 对于字符串 $S$,$S[l..r]$ 表示 $S$ 的第 $l$ 个字符到第 $r$ 个字符(包含两端)的子串。
- 对于小写字母 $a$,定义 $\mathrm{ord}(a) = 1, \mathrm{ord}(b) = 2, \ldots, \mathrm{ord}(z) = 26$。
- 对于字符串 $S = c_1c_2\ldots c_k$,定义 $h(S) = \left(\sum_{i=1}^k \mathrm{ord}(c_i) \cdot (1,000,000)^{i-1}\right) \bmod (10^9 + 7)$。
输入格式
输入按以下格式从标准输入给出。
> $N$ $M$
> $S_1$
> $S_2$
> $\vdots$
> $S_M$
> $Q$
> $type_1$ $x_1$ $y_1$ $l_1$ $r_1$
> $type_2$ $x_2$ $y_2$ $l_2$ $r_2$
> $\vdots$
> $type_Q$ $x_Q$ $y_Q$ $l_Q$ $r_Q$
输出格式
对于每个 hash 查询,输出 $h(S_x[l..r])$。
说明/提示
### 数据范围
- $1 \leq N \leq 200,\!000$
- $1 \leq M \leq 20$
- $S_i$ 仅包含小写英文字母
- $1 \leq Q \leq 200,\!000$
- $type_i = 1$ 或 $2$
- $1 \leq x_i \leq M$
- 对于 swap 查询,$x_i < y_i \leq M$
- 对于 hash 查询,$y_i = 0$
- $1 \leq l_i \leq r_i \leq N$
### 样例解释 1
分别输出:
- $h(\text{"bc"}) = 3000002$
- $h(\text{"fghij"}) = 496944447$
- $h(\text{"gc"}) = 3000007$
- $h(\text{"fbhij"}) = 491944447$
- $h(\text{"bh"}) = 8000002$
- $h(\text{"agcij"}) = 496979442$
由 ChatGPT 4.1 翻译