CF1275E3.Контрольная сумма

普及/提高-

通过率:0%

时间限制:1.00s

内存限制:256MB

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

Данные пользователей ВКонтакте хранятся на десятках тысяч серверов. Для того, чтобы можно было определять ошибки при записи данных на диск, на диск регулярно записываются текущие контрольные суммы CRC32 (Wiki, IEEE 802-3). Благодаря этому, при чтении данных можно заново вычислить контрольную сумму и проверить, что данные и контрольная сумма записаны корректно.

Разумеется, проверки на совпадение контрольной суммы встроены в большинство сервисов ВКонтакте. Но как-то раз оказалось, что в одном сегменте данных нужно изменить значение четырех последовательных байт на новое — нужно заменить значения последовательности ai,ai+1,ai+2,ai+3a_i, a_{i+1}, a_{i+2}, a_{i+3} на x0,x1,x2,x3x_0, x_1, x_2, x_3. При этом, нужно чтобы значение контрольной суммы CRC32 осталось прежним. Конечно, при изменении последовательности ее контрольная сумма изменится, поэтому кроме изменения этих четырех байт на новое значение, были выбраны четыре байта aj,aj+1,aj+2,aj+3a_{j}, a_{j+1}, a_{j+2}, a_{j+3}, которым можно назначить любое значение. Ваша задача выбрать им новые значения так, чтобы CRC32 данной последовательности не изменился, или определить, что это невозможно. Поскольку изменение данных — операция серьезная, перед самим изменением нужно определить, как изменится последовательность для qq независимых тестовых случаев.

VK 用户的数据存储在数万台服务器上。为了能够在将数据写入磁盘时检测错误,系统会定期将当前的 CRC32 校验和(维基百科,IEEE 802-3)写入磁盘。借助这一机制,在读取数据时可重新计算校验和,并验证数据与校验和是否一致、写入正确。

显然,校验和一致性检查已嵌入 VK 大多数服务中。但某次出现了一个需求:需在一个数据段中将连续四个字节的值更改为新值——即将序列 ai,ai+1,ai+2,ai+3a_i, a_{i+1}, a_{i+2}, a_{i+3} 替换为 x0,x1,x2,x3x_0, x_1, x_2, x_3。同时,要求整个序列的 CRC32 校验和保持不变。当然,直接修改这四个字节会导致校验和改变;因此,除上述四字节外,额外选定另外四个字节 aj,aj+1,aj+2,aj+3a_{j}, a_{j+1}, a_{j+2}, a_{j+3},其值可任意设定。你的任务是:为这四个字节选定新的值,使得整个序列的 CRC32 校验和不变;若不可能,则判定为无解。由于数据修改是一项关键操作,在实际执行修改前,需预先对 qq 个相互独立的测试用例,确定对应的数据修改方案。

输入格式

В первой строке дано два целых числа nn и qq — количество байт в файле и количество запросов, для которых нужно решить задачу (8≤n≤2⋅1058 \le n \le 2 \cdot 10^5; 1≤q≤1051 \le q \le 10^5).

Во второй строке дано nn чисел a0,a1,…,an−1a_0, a_1, \ldots, a_{n-1} — содержимое файла в байтах (0≤ai≤2550 \le a_i \le 255).

В следующих qq строках дано по шесть чисел i,j,x0,x1,x2,x3i, j, x_0, x_1, x_2, x_3 — позиция ii, начиная с которой нужно заменить четыре байта на x0,x1,x2,x3x_0, x_1, x_2, x_3, и позиция jj, начиная с которой можно менять четыре байта как угодно (0≤i,j≤n−40 \le i, j \le n-4; 0≤x0,x1,x2,x3≤2550 \le x_0, x_1, x_2, x_3 \le 255). Гарантируется, что отрезки [i;i+3][i; i+3] и [j;j+3][j; j+3] не пересекаются.

第一行包含两个整数 nn 和 qq — 文件的字节数以及需要处理的查询数量(8≤n≤2⋅1058 \le n \le 2 \cdot 10^5;1≤q≤1051 \le q \le 10^5)。

第二行包含 nn 个整数 a0,a1,…,an−1a_0, a_1, \ldots, a_{n-1} — 文件的字节内容(0≤ai≤2550 \le a_i \le 255)。

接下来的 qq 行,每行包含六个整数 i,j,x0,x1,x2,x3i, j, x_0, x_1, x_2, x_3 — 表示从位置 ii 开始将四个字节替换为 x0,x1,x2,x3x_0, x_1, x_2, x_3,以及从位置 jj 开始可以任意修改四个字节(0≤i,j≤n−40 \le i, j \le n-4;0≤x0,x1,x2,x3≤2550 \le x_0, x_1, x_2, x_3 \le 255)。保证区间 [i;i+3][i; i+3] 与 [j;j+3][j; j+3] 不相交。

输出格式

Для каждого запроса выведите четыре целых числа z0,z1,z2,z3z_0, z_1, z_2, z_3, на которые нужно заменить четыре байта с номерами j,j+1,j+2,j+3j, j+1, j+2, j+3, чтобы crc32 не изменился. Обратите внимание, что все запросы независимы, и на самом деле последовательность не изменяется.

Если существует несколько решений, выведите любое, а если для данного запроса валидного решения нет, выведите No solution.

对于每个查询,请输出四个整数 z0,z1,z2,z3z_0, z_1, z_2, z_3,用于替换编号为 j,j+1,j+2,j+3j, j+1, j+2, j+3 的四个字节,使得 CRC32 校验值保持不变。注意:所有查询相互独立,序列实际上不会被修改。

若存在多个解,输出任意一个即可;若当前查询无有效解,则输出 No solution。

输入输出样例

  • 输入#1

    8 1
    1 2 3 4 5 6 7 8
    0 4 0 0 0 0

    输出#1

    212 34 127 159
  • 输入#2

    16 3
    4 5 6 7 0 0 0 0 0 0 0 85 200 47 47 0
    11 0 0 0 0 0
    3 12 7 0 0 0
    0 11 0 0 0 0

    输出#2

    0 0 0 0
    200 47 47 0
    0 0 0 0

说明/提示

CRC32 байтовой последовательности из первого примера (1 2 3 4 5 6 7 8) равен 3fca88c5, CRC32 измененной последовательности (0 0 0 0 212 34 127 159) так же равен 3fca88c5. Стандартная утилита crc32 из большинства дистрибутивов линукса должна посчитать от них данную контрольную сумму.

CRC32 последовательности из второго примера равен ecbb4b55.

CRC32 第一个示例中的字节序列(1 2 3 4 5 6 7 8)为 3fca88c5,而 修改后的序列(0 0 0 0 212 34 127 159)的 CRC32 值同样为 3fca88c5。大多数 Linux 发行版中自带的标准工具 crc32 应能对此两组数据计算出上述校验和。

第二个示例中序列的 CRC32 值为 ecbb4b55。

输入解题思路,AI测评打分。不知道怎么写?

首页