【ABC200F】Minflip Summation
\(\texttt{ABC200 }\text{Minflip Summation}\)
给定由
1
,0
,?
构成的字符串 \(S'\) 和正整数 \(k\) ,从而得到 \(k\) 个 \(S'\) 顺序拼接而成的字符串 \(S\) 。?
可以任意地填写1
或0
,设 \(S'\) 中的?
数量为 \(q\) ,这样得到了 \(2^{qk}\) 个新字符串。考虑用最少的步数将每一个新字符串变换成全由1
构成的字符串或者由0
构成的字符串,变换规则为区间取反。输出这些最少步数的总和。答案模 \(1e9+7\) 。数据范围:\(1\le|S'|\le 1e5,1\le k\le 1e9\) 。
第一个小 trick 是考虑异或差分,按位异或的逆运算也是按位异或。这样,区间修改就转化为单点修改。目标是使差分数组均变为 0
,单点修改可以一次只取反一个,也可以一次取反两个,所以只需要考察有几个 01
段和 10
段。设有 \(k\) 个这样的段,则至少需要修改 \(\lfloor\frac{k+1}{2}\rfloor\) 次修改,且可以做到。具体地,两两配对修改后,若还有剩余一个点,再修一次。据此,先考虑不存在 ?
的情况 ,从左往右扫来转移,修改次数增加当且仅当段数从偶数变化到奇数,可以得到:
- 若当前位为
0
,那么修改次数增加的充要条件是第一位为1
且前一位为1
。 - 若当前位为
1
,那么修改次数增加的充要条件是第一位为0
且前一位为0
。
所以,次数的增加与否,仅和第一位和前一位有关。
在加入 ?
后,只需要把 \(\text{mark}_i(\text{第一位},\text{前一位})\) 的推广到 \(\text{cnt}_i(\text{第一位},\text{前一位})\) ,也就是说,某种状态可能不只出现一次,但步数的增加方式是类似的。
设计状态:
简记为 \(\text{A}_i\) 。考虑从第 \(i-1\) 到第 \(i\) 位的转移矩阵 \(M_i\) :
- 若第 \(i\) 位是
0
,则转移矩阵 \(\text{Zero}\) :
- 若第 \(i\) 位是
1
,则转移矩阵 \(\text{One}\) :
- 若第 \(i\) 位是
?
,则转移矩阵 \(\text{Que}=\text{Zero}+\text{One}\)
将 \(k\) 个 \(S'\) 拼接,只需求出 \(\prod_{i=1}^{|S'|}M_i\) 后套个快速幂即可。
总复杂度 \(O(|S'|+\log(k))\) 。
\(\square\)
原文地址:https://www.cnblogs.com/gsjz/p/14974168.html
- dedecms建的网站如何去掉/index.html
- WPF ContextMenu的使用
- Json的序列化与反序列化以及乱入的k_BackingField
- 亚马逊面试题
- VisualStudio 怎么使用Visual Leak Detector
- Cannot find module 'socket.io'
- 【学术】独热编码如何在Python中排列数据?
- 比特币的私钥【区块链生存训练】
- Unity3D学习笔记第一课
- Extjs4处理后台json数据中日期和时间的方法
- 机器学习:Python测试线性可分性的方法
- Java 机器学习库Smile实战(一)SVM
- 交易Transaction【区块链生存训练】
- 马尔可夫链文本生成的简单应用:不足20行的Python代码生成鸡汤文
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- struts2(一)---编写第一个struts2项目
- Struts2(二)---将页面表单中的数据提交给Action
- 03 . Shell数组和函数
- Shell百宝箱(后续会不断更新)
- 09 . Prometheus监控tomcat+jvm
- 09 . Kubernetes之pv、pvc及使用nfs网络存储应用
- 10 . Kubernetes之Configmap,Secret
- struts2(三)---使用EL表达式,显示Action中的数据
- 02 . 分布式存储之FastDFS 高可用集群部署
- 11 . KubernetesRBAC认证及ServiceAccount、Dashboard
- 12 . Kubernetes之Statefulset 和 Operator
- 01 . SaltStack部署配置及简单应用
- 02 . SaltStack高级用法(Python API)
- 小加载动画
- 日志收集工具简单对比