zoukankan      html  css  js  c++  java
  • CF1392G

    CF1392G

    给定一个长度为 (k)01(s,t),给定 (n) 个操作,第 (i) 个操作为交换 (s) 中的 (u_i)(v_i)

    然后你选择一个区间的操作依次执行,这个区间的长度不能小于 (m)

    最大化 (s)(t) 相同的位置数量。

    (m,nle 10^6,kle 20)

    Solution

    神仙题。

    (w(s,t)) 表示 (s)(t) 得到的答案。

    (p(l,r)) 表示顺序操作 (l o r)

    (p(r,l)) 表示顺序操作 (r o l)

    • 性质 1

    (sxrightarrow{p(l,r)}s',txrightarrow{p(l,r)}t',w(s,t)=w(s',t'))

    注意到每一位是独立被操作了相同的,不会改变。

    所以设 (sxrightarrow{p(l,r)}s'),那么若 (s'xrightarrow{p(r+1,n)}s'',txrightarrow{p(r+1,n)}t''),则 (w(s',t)=w(s'',t''))

    同理,答案也等价于 (s'xrightarrow{p(l-1,1)}s'',txrightarrow{p(r,1)}t'') 情况下的答案。

    所以我们得到了 (n) 个字符串 (s')(n) 个字符串 (t'),我们发现问题等价于选两个下标差大于等于 (m) 的字符串并得到答案。

    还是不好做。

    然后观察到,所有 (s/t) 的二进制下 (1) 的个数固定,设 ( extrm{bit}(s))(a)( extrm{bit}(t)=b)( extrm{bit}(s~mathbf{and}~t)=c),那么有答案为 (k-(a-c)-(b-c)=k-a-b+2c),所以问题等价于最大化 (c)

    然后维护 (f_{0,x}) 表示所有 (s_i=x) 中最小的 (i),维护 (f_{1,x}) 表示所有 (t_i=x) 中最大的 (i)

    然后将他们进行子集转移,对于某个 (x),如果 (f_{1,x}-f_{0,x}ge m),那么就可以更新答案,即存在两个字符串满足其并大于等于 ( extrm{bit}(x))

    复杂度为 (mathcal O(nk+2^kk))

  • 相关阅读:
    DBHelper类
    户籍不在本市并已申请基本养老保险或基本医疗保险关系转移手续销户提取业务办理指南(试行)
    Android 打开/播放电脑的音频/视频文件
    (技术贴)如何鉴定绿茶婊
    Swift初探(一)
    关于android移动终端IM的一些问题
    C++中对象、引用、指针
    TextView
    新API
    开发者必备的6款源码搜索引擎
  • 原文地址:https://www.cnblogs.com/Soulist/p/13657478.html
Copyright © 2011-2022 走看看