当前位置: 首页 > news >正文

AT_abc401_d [ABC401D] Logical Filling 题解

题目传送门

解题思路

首先分析题意。

  1. 容易发现类似 ?oo? 的问号其实是“假问号”,因为 o 不能连续出现,所以只能是 .

  2. 其次就是当 k k k 为字符串 s s s 最多能包含 o 的数量时才可能会有 ? 变成 o。否则判完第 1 1 1 条直接输出就行了。

那我们现在就来看看如何统计 s s s 所能包含 o 的最大数量。

这里我们可以把 s s s 拆分成若干个只含 ? 最长连续子串 t i t_i ti

由于我们先处理了第 1 1 1 种情况,所以 t i t_i ti 会类似 .|????|.,其中 | 之间的字符串就是 t i t_i ti。我们手动模拟一下:

定义 ∣ s ∣ |s| s 为字符串 s s s 的长度。

  • ∣ t i ∣ |t_i| ti 为奇数时,类似 o.o.o 时所包含 o 的数量最多。最多可以贡献 ⌈ ∣ t i ∣ 2 ⌉ \lceil \frac{|t_i|}{2} \rceil 2tio,在 C++ 中表示为 len / 2 + 1

  • ∣ t i ∣ |t_i| ti 为偶数时,类似 o.o.o..o.o.o 时所包含 o 的数量都是最多的,最多可以贡献 ∣ t i ∣ 2 \frac{|t_i|}{2} 2tio

最后我们将所有贡献统计起来再加上原有的 o 的数量,如果为 k k k,那么长度为奇数的 t i t_i ti 就可以确定,长度为偶数的 t i t_i ti 就还是全是 ?

至于为什么只有贡献为 k k k 时才能确定,比如 s s so.??.o.??? k = 4 k = 4 k=4,符合条件的字符串有 o.o..o.o..o..o.o.o..o.o..o..o.o.o..o...o……你会发现每个 ? 都有多种可能。

CODE:

/*
15 7
????.?????.????5 3
?????4 2
?..?
*/
/*
15 7
????.?????.????5 3
?????4 2
?..?
*/
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main() {ios::sync_with_stdio(false);ios_base::sync_with_stdio(false);cin.tie(0), cout.tie(0);int n, k, cnt = 0;cin >> n >> k;string a;cin >> a;cnt = (a[0] == 'o' ? 1 : 0);for (int i = 1; i < n; i++) {if (a[i] == '?' && (a[i - 1] == 'o' || i < n - 1 && a[i + 1] == 'o')) {a[i] = '.';}if (a[i] == 'o') {cnt++;}}if (cnt == k) {for (int i = 0; i < n; i++) {if (a[i] == '?') {a[i] = '.';}}cout << a;return 0;}if (a[0] == '?') {if (a[1] == 'o') {a[0] = '.';}}for (int i = 0; i < n; i++) {if (a[i] == '?') {//前后面一定是 .int j = i;while (a[i] == '?' && i < n) {i++;}//o.????.ocnt += (i - j + 1) / 2;  //(区间长度 + 1) / 2,算的只是 ? 最多可以替换成多少个 o,懒得用 ceil//不用 i--,因为 a[i] 一定为 . }}if (cnt == k) {for (int i = 0; i < n; i++) {if (a[i] == '?') {//前后面一定是 .int j = i;while (a[i] == '?' && i < n) {i++;}if ((i - j) & 1) {for (int k = j; k < i; k++) {if ((k - j) % 2 == 0) {a[k] = 'o';} else {a[k] = '.';}}}}}}cout << a;return 0;
}
http://www.xdnf.cn/news/535519.html

相关文章:

  • 经典密码学和现代密码学的结构及其主要区别(1)凯撒密码——附py代码
  • 酒店运营中一次性用品选购要点及扬州卓韵酒店用品的专业咨询服务
  • 初识函数------了解函数的定义、函数的参数、函数的返回值、说明文档的书写、函数的嵌套使用、变量的作用域(全局变量与局部变量)
  • C++ 关于C++中IO流的相关内容 stringstream的相关介绍
  • 「卫星百科」四维高景系列卫星
  • 从API到UI:直播美颜SDK中的滤镜与贴纸功能开发与落地方案详解
  • 理解UDP协议
  • 【二分 优先队列】P3611 [USACO17JAN] Cow Dance Show S|普及+
  • 天才简史——Paolo Fiorini与他的速度障碍法
  • 禁止在Windows命令行输入python后跳转Microsoft Store
  • Java反射机制详解:原理、应用与实战
  • 使用for循环和字典功能,统计字符出现在一个英文句子中的次数(python)
  • 雷电模拟器安装 KitsuneMagisk (原 Magisk-delta)
  • Python训练营打卡DAY30
  • 关于在Unity项目中使用Post Processing插件打包到web端出现的问题
  • 6K型护套连接器DLJ0601(2000)-00
  • Java大厂面试三轮问答:微服务与数据库技术深度解析
  • token令牌
  • 自定义协议与序列化
  • 初学c语言16(内存函数)
  • 哈夫曼编码:数据压缩的优雅艺术
  • 【CodeBuddy 】从0到1,让网页导航栏变为摸鱼神器
  • 学习VS2022离线安装包的下载方法
  • unity UGUI虚线框shader
  • 无符号长整型数x的循环右移
  • Docker构建 Dify 应用定时任务助手
  • unity 第一人称控制器
  • std::ranges::views::as_const 和 std::ranges::as_const_view
  • ABAP创建类
  • 【Tools】VMware Workstation 17.6 Pro安装教程