尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

CF2048H Kevin and Strange Operation

CF2048H Kevin and Strange Operation
📅 发布时间:2026/6/20 8:14:17

操作的自由度很大,打表可以发现限制操作的位置只增不减也是对的。

考虑怎么判断一个串 \(t\) 是否合法。

观察到对于一个位置 \(i\) 满足 \(s_i=0\),想要通过操作使 \(s_i\) 变为 \(1\),只需要 \(>i\) 的位置删掉了 \(\ge c_i\) 个数。其中 \(c_i\) 为 \(>i\) 的第一个 \(s=1\) 位置与 \(i\) 的距离。

那么可以去倒着对 \(t\) 做匹配,每次如果当前的 \(s_i\) 和 \(t\) 的最后一位不同,则需要删除 \(i\)。

考虑对匹配的过程 dp。\(f_{i,j}\) 表示删除了 \(i\),且 \(i\sim n\) 有 \(j\) 个位置被删除。

注意到如果 \(s_i=1\),那么我们需要向前找到第一个 \(s_p=0\) 的位置 \(p\)。而此时 \(p+1\sim i\) 都会被删除,于是需要 \(c_p\ge j+i-p\),这和 \(s_i=1\) 是矛盾的。于是有 \(s_i=0\)。

考虑 dp 怎么转移。我们已知了 \(s_i=0\),那么当前 \(t\) 的结尾一定是 \(1\),而 \(j<c_i\),所以 \(t\) 一定会匹配到 \(i\) 之前的第一个 \(1\) 位置 \(p\)。\(p+1\sim i\) 一定都会被删除。枚举下一个被删的位 \(q\),需要满足 \(q<p\),且 \(c_q\ge j+i-p\)。然后 \(f_{i,j}\to f_{q,j+i-p}\)。

这个的状态数已经 \(O(n^2)\) 了,考虑优化。

注意到 \(c_i\) 是和后面第一个 \(1\) 有关的,考虑把 \(0\) 缩连续段。一个连续段内不会有转移,并且此时状态数就是 \(O(n)\) 的了。

这时上面的转移就是若干次区间加,差分即可。复杂度 \(O(n)\)。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int> ;const int mod = 998244353;
void Add(int &x, ll y) { x = (x + y) % mod; } 
const int kN = 1e6 + 5;
int n;
string s;
int d[kN];
bool a[kN];
vector<int> f[kN];struct Node {int l, r, v;Node() { }Node(int _l, int _r, int _v) {l = _l;r = _r;v = _v;}
}seg[kN];void Solve() {cin >> s;n = s.size(), s = " " + s;fill(d + 1, d + n + 1, 0);fill(f + 1, f + n + 1, vector<int> ());for(int i = 1; i <= n; i++) a[i] = (s[i] == '1');int m = 0;for(int l = 1, r; l <= n; l = r + 1) {for(r = l; (r < n) && (a[r + 1] == a[r]); r++) ;seg[++m] = Node(l, r, a[l]);}int ans = n;for(int i = m; i; i--) {if(seg[i].v) continue;int l = seg[i].l, r = seg[i].r;int len = r - l + 1;f[i].resize(len + 1, 0);for(int j = 1, s = 0; j <= len; j++) {Add(s, d[j]);f[i][j] = s + (j == 1);Add(ans, (ll)f[i][j] * (l - 1) % mod * (len - j + 1));}for(int j = 1; j <= len; j++) {Add(d[j + 1], f[i][j]);Add(d[len + 2], mod - f[i][j]);}}cout << ans << "\n";
}int main() {
//  freopen("1.in", "r", stdin);
//  freopen("1.out", "w", stdout);ios::sync_with_stdio(0), cin.tie(0);int t;cin >> t;while(t--) Solve(); return 0;
}

相关新闻

  • Visual Studio 离线安装0x80131509
  • Oracle备份恢复:backup as copy保留文件名不变化,只更改路径名
  • 读书笔记:数据库中的预连接神器:位图连接索引

最新新闻

  • 深入解析CAN控制器:从寄存器位到消息调度与滤波机制
  • Siri要接入AI了,苹果手机上一句话让GPT写文案、DeepSeek写代码的时刻来了
  • 从M68HC11E实战解析8位MCU架构:寄存器、外设与低功耗设计
  • 深入解析LPC408x/7x外设与电源管理:从原理到低功耗实战
  • 重庆黄金回收避坑2026|多数用户遇压价 无资质回收需谨慎 - 名奢变现站
  • 大师兄小论文剖析

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号