\(\mathcal{Description}\)

  Link.

  给定两个长度为 \(K\) 的 \(01\) 串 \(S,T\) 和 \(n\) 组操作 \((a_i,b_i)\),意义为交换 \(S_{a_i}\) 和 \(S_{b_i}\)。你需要执行一段长度不小于 \(m\) 的连续操作区间,最大化 \(S\) 和 \(T\) 相同的位数。求出最大相同位数。

  \(K\le20\),\(m\le n\le10^6\)。

\(\mathcal{Solution}\)

  一个简单的性质:\(S\) 和 \(T\) 同时执行相同操作,答案不变。

  那么可以想到利用后缀和——记 \(S_i\) 表示 \(S\) 依次执行操作 \(i\sim n\) 所得到的串,\(T_i\) 同理。根据性质,\(S\) 操作区间 \([l,r]\) 后与 \(T\) 的相同位数等于 \(S_l\) 和 \(T_{r+1}\) 的相同位数。

  现在问题变成,给定两个长为 \(n+1\) 的串序列 \(\{S_{n+1}\},\{T_{n+1}\}\),求:

\[ \max_{1\le i+m-1\le r\le n+1}\{\operatorname{same}(S_i,T_j)\}
\]

  其中 \(\operatorname{same}\) 表示两个串的相同位数。

  接下来考虑 DP。定义:

\[ f(0,v)=\min_{v\in S_i}i\\
f(1,v)=\max_{v\in T_i}i
\]

  枚举二进制 \(v\),转移,如果有 \(f(0,v)+m-1\le f(1,v)\),就可以用 \(\operatorname{popcount}(v)\) 更新答案。

\(\mathcal{Code}\)

/* Clearink */

#include <cstdio>

inline int rint ( const int base = 10 ) {
int x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * base + ( s ^ '0' );
return x;
} template<typename Tp>
inline void wint ( Tp x ) {
if ( x < 0 ) putchar ( '-' ), x = ~ x + 1;
if ( 9 < x ) wint ( x / 10 );
putchar ( x % 10 ^ '0' );
} inline void chkmin ( int& a, const int b ) { b < a ? a = b : 0; }
inline void chkmax ( int& a, const int b ) { a < b ? a = b : 0; } const int MAXN = 1e6, MAXS = 1 << 20;
int n, m, S, T, K, a[MAXN + 5], b[MAXN + 5], p[MAXN + 5], f[2][MAXS | 5]; inline int swp ( int x ) {
int ret = 0;
for ( int i = 0; i < K; ++ i ) ret |= ( ( x >> i ) & 1 ) << p[i];
return ret;
} int main () {
n = rint (), m = rint (), K = rint ();
S = rint ( 2 ), T = rint ( 2 );
for ( int i = 1; i <= n; ++ i ) a[i] = K - rint (), b[i] = K - rint ();
for ( int s = 0; s < 1 << K; ++ s ) f[0][s] = n + 1, f[1][s] = -1;
f[1][T] = n + 1;
for ( int i = 0; i < K; ++ i ) p[i] = i;
for ( int i = n; i; -- i ) {
p[a[i]] ^= p[b[i]] ^= p[a[i]] ^= p[b[i]];
chkmin ( f[0][swp ( S )], i ), chkmax ( f[1][swp ( T )], i );
}
int ans = -1, ansl = -1, ansr = -1;
for ( int s = ( 1 << K ) - 1; ~s; -- s ) {
for ( int i = 0; i < K; ++ i ) {
if ( !( ( s >> i ) & 1 ) ) continue;
chkmin ( f[0][s ^ ( 1 << i )], f[0][s] );
chkmax ( f[1][s ^ ( 1 << i )], f[1][s] );
}
if ( f[1][s] - f[0][s] >= m ) {
if ( int t = __builtin_popcount ( s ); ans < t ) {
ans = t, ansl = f[0][s], ansr = f[1][s] - 1;
}
}
}
ans = 2 * ans + K - __builtin_popcount ( S ) - __builtin_popcount ( T );
wint ( ans ), putchar ( '\n' );
wint ( ansl ), putchar ( ' ' ), wint ( ansr ), putchar ( '\n' );
return 0;
}

Solution -「CF 1392G」Omkar and Pies的更多相关文章

  1. Solution -「CF 1372E」Omkar and Last Floor

    \(\mathcal{Description}\)   Link.   给定一个 \(n \times m\) 的矩阵,每行被划分为若干段,你可以钦定每段中恰好一个位置为 \(1\),其余位置为 \( ...

  2. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  3. Solution -「CF 1622F」Quadratic Set

    \(\mathscr{Description}\)   Link.   求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...

  4. Solution -「CF 923F」Public Service

    \(\mathscr{Description}\)   Link.   给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...

  5. Solution -「CF 923E」Perpetual Subtraction

    \(\mathcal{Description}\)   Link.   有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...

  6. Solution -「CF 1586F」Defender of Childhood Dreams

    \(\mathcal{Description}\)   Link.   定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...

  7. Solution -「CF 1237E」Balanced Binary Search Trees

    \(\mathcal{Description}\)   Link.   定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...

  8. Solution -「CF 623E」Transforming Sequence

    题目 题意简述   link.   有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...

  9. Solution -「CF 1023F」Mobile Phone Network

    \(\mathcal{Description}\)   Link.   有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...

随机推荐

  1. spring cloud --- 使用 actuator 热更新【刷新】单机配置文件

    1.前言 分布式微服务想要热更新配置文件,还需要 消息中间件 配合使用 ,一般使用 rabbitMQ 或 Kafka ,这里不解释 . 这篇随笔 只讲解 底层的 单机热更新配置文件 2.环境 spri ...

  2. SSRF漏洞用到的其他协议(dict协议,file协议)

    0x00 引言 当SSRF打内网reids时,若gopher协议用不了,我们也可以用其他协议 0x01 dict协议一.定义:词典网络协议,在RFC 2009中进行描述.它的目标是超越Webster ...

  3. 彻彻底底地理解TCP三次握手和四次挥手的全部过程

    三次握手 我们先提出一些问题,但是我们暂且不回答这些问题,下面我会尽我所能详尽地讲解TCP的三次握手过程,然后看完你可以在评论区留下你对问题的答案,我们可以一起探讨. 为什么要握手 为什么是三次而不是 ...

  4. 《剑指offer》面试题15. 二进制中1的个数

    问题描述 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输入:00000 ...

  5. Sentry 开发者贡献指南 - 测试技巧

    作为 CI 流程的一部分,我们在 Sentry 运行了多种测试. 本节旨在记录一些 sentry 特定的帮助程序, 并提供有关在构建新功能时应考虑包括哪些类型的测试的指南. 获取设置 验收和 pyth ...

  6. Cesium中文网的朋友们

    目前已开通知识星球-Cesium中文网的朋友们 注意:仔细思量好再进来,一旦付费,概不退费.下述内容均尽力而为. 1. 每月一次技术交流(Cesium为主),提供源码. 2. 每人5次/周免费提问(C ...

  7. Elasticsearch使用系列-ES增删查改基本操作+ik分词

    Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 一.安装可视化工具Kibana ES是一个NoSql数据库应用.和其他数据库 ...

  8. Clang-Format 个人常用配置

    Clang-Format 个人常用配置 本文记录 Clang-Format 个人常用配置. 欲了解更多配置选项,可查阅 官方文档. BasedOnStyle: Google AccessModifie ...

  9. 笔记:Bridging the Gap Between Relevance Matching and Semantic Matching for Short Text Similarity Modeling

    笔记:Bridging the Gap Between Relevance Matching and Semantic Matching for Short Text Similarity Model ...

  10. elasticsearch查询之大数据集分页查询

    一. 要解决的问题 search命中的记录特别多,使用from+size分页,直接触发了elasticsearch的max_result_window的最大值: { "error" ...