0%

2025_ICPC_NERC_Northern_Eurasia_Finals——M. Medical Parity

题目大意

题目总结:M. Medical Parity

问题描述

给定两个长度为 nn 的二进制字符串 xx'(测试结果串)和 yy'(奇偶校验控制串)。

在理想情况下,字符串 yyxx 必须满足以下关系:

对于每一个位置 ii1in1 \le i \le n),yiy_i 是字符串 xxii 个字符中 ‘1’ 的数量对 2 取模的结果。

即:yi=(j=1ixj)(mod2)y_i = (\sum_{j=1}^{i} x_j) \pmod 2

这意味着:

  • 如果 xx 的前 ii 个字符中有奇数个 ‘1’,则 yi=1y_i = 1

  • 如果 xx 的前 ii 个字符中有偶数个 ‘1’,则 yi=0y_i = 0.

由于记录数据时可能存在错误,输入的 xx'yy' 可能不满足上述规则。你需要通过翻转最少数量的位(将 ‘0’ 变 ‘1’ 或将 ‘1’ 变 ‘0’),使得修改后的 yy 成为修改后的 xx 的合法奇偶校验控制串。翻转操作可以在 xx'yy' 的任意位置进行。

输出要求

输出使 yy 成为 xx 的合法奇偶校验串所需的最少总翻转次数。


样例解释

  • 样例 1
    输入:x=11101,y=10110x'=11101, y'=10110
    根据 xx' 计算合法的校验串 yy

    • i=1i=1: xx 前 1 位有 1 个 ‘1’(奇数),y1=1y_1=1
    • i=2i=2: xx 前 2 位有 2 个 ‘1’(偶数),y2=0y_2=0
    • i=3i=3: xx 前 3 位有 3 个 ‘1’(奇数),y3=1y_3=1
    • i=4i=4: xx 前 4 位有 3 个 ‘1’(奇数),y4=1y_4=1
    • i=5i=5: xx 前 5 位有 4 个 ‘1’(偶数),y5=0y_5=0
      计算得 y=10110y=10110,与给定的 yy' 完全一致。
      结论: 翻转次数为 0。
  • 样例 2
    输入:x=11101,y=10010x'=11101, y'=10010
    根据 xx' 计算出的合法 yy 应为 1011010110(见样例 1)。
    对比给定的 y=10010y'=10010,只有第 3 位不同(y3y_3 应为 1,给定为 0)。
    结论: 只需翻转 yy' 的第 3 位,总翻转次数为 1。

  • 样例 3
    输入:x=01100,y=10110x'=01100, y'=10110
    若要达成合法状态,一种最少翻转方案是:

    1. 翻转 xx' 的第 1 位,使其变为 1110011100
    2. 此时合法的 yy 应为 1011110111
    3. 对比原 y=10110y'=10110,只需再翻转 yy' 的最后一位(第 5 位)。
      结论: 总共翻转了 2 次(xx' 一次,yy' 一次)。

思路讲解

yi=cimod2y_i = c_i \bmod 2,其中 cic_ixxii 个字符中 1 的个数。注意到 yiyi1=xiy_i \oplus y_{i-1} = x_i(定义 y0=0y_0 = 0。也就是说,xx 完全由 yy 决定(反之亦然)。所以你实际上只需要确定一个最终的 yy(或 xx),另一个就自动确定了。

(其实只要观察到了红字的这个约束,红字的这个东西,那么剩下来这个DP啊就非常容易了。)

1
2
3
4
5
6
vector<array<ll,2>> dp(N+2,{INF,INF});
dp[0][0]=0;
for (int i=1;i<=N;++i) {
dp[i][1]=(Y[i]!=1)+min(dp[i-1][0]+(X[i]!=1),dp[i-1][1]+(X[i]!=0));
dp[i][0]=(Y[i]!=0)+min(dp[i-1][0]+(X[i]!=0),dp[i-1][1]+(X[i]!=1));
}

AC代码

AC
https://codeforces.com/contest/2181/submission/362133326

心路历程(WA,TLE,MLE……)