Balanced 01-String

news/2026/1/21 23:29:38/文章来源:https://www.cnblogs.com/onlyblues/p/19514124

Balanced 01-String

题目描述

小苯有一个长度为 $n$ 的字符串 $s$,只包含字符 $\texttt{'0'}$、$\texttt{'1'}$ 和 $\texttt{'?'}$。

他定义一个 $01$ 字符串是平衡的,当且仅当字符串中所有相邻两个字符相同的对数(即满足 $s_i = s_{i+1}$ 的 $i$ 的数量)是偶数。

(特别的,长度为 $1$ 的 $01$ 串必然是平衡的,因为此时相邻相同对数为 $0$,$0$ 也是偶数。)

小苯可以将每个 $\texttt{'?'}$ 替换为 $\texttt{'0'}$ 或 $\texttt{'1'}$。你的任务是求出,在所有可能的替换结果中,有多少个 $01$ 字符串是平衡的?(结果对 $998244353$ 取模。)

输入描述:

第一行一个整数 $T\ (1 \leqq T \leqq 10)$,表示测试数据组数。

接下来 $T$ 行,每行一个字符串 $s \ (1 \leqq |s| \leq 5 \times 10^5)$,只包含 $\texttt{'0'}$、$\texttt{'1'}$、$\texttt{'?'}$。

保证所有测试数据的字符串长度 $n$ 之和不超过 $5 \times 10^5$。

输出描述:

对于每组数据,输出一个整数表示满足条件的 $01$ 字符串数量对 $998244353$ 取模的结果。

示例1

输入

2
0?1
????

输出

0
8

说明

第一组数据:$s = \texttt{" 0?1"}$,两种替换:

$\texttt{"001"}$:相邻相同对数为 $1$($\texttt{"00"}$),奇数,不平衡。

$\texttt{"011"}$:相邻相同对数为 $1$($\texttt{"11"}$),奇数,不平衡。

输出 $0$。

 

解题思路

  先给出容易想到的一般做法,直接无脑考虑 dp 就行了。定义 $f(i,j,k)$ 表示前 $i$ 个字符中,第 $i$ 个字符为 $j \in \{0,1\}$ ,且相邻相同对数的奇偶性为 $k \in \{0,1\}$ 时的方案数。根据第 $i-1$ 个字符的类型进行状态转移,状态转移方程为 $$f(i,j,k) = \sum\limits_{j=0}^{1}{[s_i=j]\sum\limits_{k=0}^{1}{f(i-1,0,[j=0] \oplus k) + f(i-1,1,[j=1] \oplus k)}}$$

  需要注意的是,当 $s_i = \texttt{?}$ 时,$s_i$ 既可以取 $0$ 或 $1$。最后要求的答案就是 $f(n,0,0) + f(n,1,0)$。

  AC 代码如下,时间复杂度为 $O(n)$:

#include <bits/stdc++.h>
using namespace std;typedef long long LL;const int N = 5e5 + 5, mod = 998244353;char s[N];
int f[N][2][2];void solve() {cin >> s;int n = strlen(s);memset(f[0], 0, sizeof(f[0]));if (s[0] == '0' || s[0] == '?') f[0][0][0] = 1;if (s[0] == '1' || s[0] == '?') f[0][1][0] = 1;for (int i = 1; i < n; i++) {memset(f[i], 0, sizeof(f[0]));for (int j = 0; j <= 1; j++) {if (s[i] != '?' && s[i] - '0' != j) continue;for (int k = 0; k <= 1; k++) {for (int u = 0; u <= 1; u++) {f[i][j][k] = (f[i][j][k] + f[i - 1][u][(j == u) ^ k]) % mod;}}}}cout << (f[n - 1][0][0] + f[n - 1][1][0]) % mod << '\n';
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin >> t;while (t--) {solve();}return 0;
}

  下面给出本题的一个很巧妙的做法。容易知道长度为 $n$ 的字符串有 $n-1$对相邻位置。假设其中相同对数的数量为 $a$,不同对数的数量为 $b$,那么有 $a+b=n-1$。由于要求 $a$ 为偶数,即 $n-1-b$ 为偶数,等价于 $b$ 与 $n-1$ 的奇偶性相同,即 $b \equiv n-1 \pmod{2}$。其中 $n-1$ 是定值,因此 $(n-1) \bmod 2$ 是确定的。

  而 $b \bmod 2 = \left( \sum\limits_{i=1}^{n-1}{[s_i \ne s_{i+1}]} \right) \bmod 2$。由于最终的 $s_i$ 只有 $0$ 和 $1$ 两种取值,因此 $[s_i \ne s_{i+1}] = s_i \oplus s_{i+1}$,所以 $\left( \sum\limits_{i=1}^{n-1}{[s_i \ne s_{i+1}]} \right) \bmod 2 = \left( \sum\limits_{i=1}^{n-1}{s_i \oplus s_{i+1}} \right) \bmod 2$。其中每一项成对出现并抵消,且在模 $2$ 加法下求和等价于逐项异或,因此最终有 $b \bmod 2 = s_1 \oplus s_n$。所以 $a$ 是偶数等价于 $s_1 \oplus s_n = (n-1) \bmod 2$。

  这也意味着该条件的满足只与 $s$ 首尾两个字符的取值有关,而与中间字符 $s_2, s_3, \dots, s_{n-1}$ 无关。只要首尾固定后,无论中间取什么值,$b$ 的奇偶性都是一样的。因此假设中间位置有 $c$ 个 $\texttt{?}$,那么就会贡献 $2^c$ 种方案。

  所以我们只需枚举首尾字符所有可能的取值(若为 $\texttt{?}$ 则可取 $0$ 和 $1$,否则只能取确定的值),对于每一种合法的首尾组合,若其异或值恰好等于 $(n-1) \bmod 2$,则将 $2^c$ 累加到答案。

  AC 代码如下,时间复杂度为 $O(n)$:

#include <bits/stdc++.h>
using namespace std;typedef long long LL;const int mod = 998244353;void solve() {string s;cin >> s;int p = 1;for (int i = count(s.begin() + 1, s.begin() + max<int>(1, s.size() - 1), '?'); i; i--) {p = 2 * p % mod;}int ret = 0;for (char i = '0'; i <= '1'; i++) {if (s[0] != '?' && s[0] != i) continue;for (char j = '0'; j <= '1'; j++) {if (s.back() != '?' && s.back() != j) continue;if (~(s.size() - 1 - (i ^ j)) & 1) ret = (ret + p) % mod;}}cout << ret << '\n';
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin >> t;while (t--) {solve();}return 0;
}

 

参考资料

  牛客周赛127题目讲解:https://www.bilibili.com/video/BV1qoksBzEtg/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1196653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型学习全攻略:零基础入门、35岁转行可行性与就业前景

文章探讨35岁转行学习AI大模型的可行性、零基础入门可能性和行业前景。指出35岁转行完全可行&#xff0c;零基础学习者可通过丰富资源掌握技能。AI大模型行业前景广阔&#xff0c;需求增长。文章提供了系统学习路线&#xff0c;包括基础理解、API应用开发、应用架构实践和私有化…

基于SpringBoot+Vue一鹿租车公司车辆管理系统的设计与实现

博主主页&#xff1a;一点素材 博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬…

D6 707.设计链表

707 设计链表(力扣:https://leetcode.cn/problems/design-linked-list/ 条件: 见原题链接 Tips: 代码: 点击查看代码 struct ListNode{int val;ListNode* prev;ListNode* next;//使用初始化列表ListNode( int num…

实验室智能监控系统实战源码-基于YOLOv8的实时目标检测与PyQt5可视化界面

实验室智能监控系统实战源码-基于YOLOv8的实时目标检测与PyQt5可视化界面 前言 实验室安全管理一直是科研机构和教育单位的重点。传统依赖人工巡查的方式存在效率低、易遗漏、成本高等问题&#xff0c;难以满足全天候监控需求。随着计算机视觉技术的发展&#xff0c;基于深度…

毕业党救星!5个降AI率工具大公开,亲测好用,能帮你把AI率降低80%以上

上周答辩前夕&#xff0c;我室友差点崩溃——论文被导师退回来了&#xff0c;原因是"疑似大量使用AI生成内容"。她哭着说&#xff1a;"我明明自己改过好几遍啊&#xff0c;为什么还是被查出来了&#xff1f;" 这场景我太熟悉了。去年我自己也经历过&#…

如何在idea中创建mavenweb项目

1、首先进入idea,正常新建一个maven项目2、建立完成之后会出现java、resources这两个包。在main包里面,也就是和java、resources这两个包同一级中新建一个webapps的包(这个包的包名是任意的,这里就先命名webapps)…

AI率过高有救了!这5个工具实测能打,可将论文AIGC痕迹大幅降低80%

上周答辩前夕&#xff0c;我室友差点崩溃——论文被导师退回来了&#xff0c;原因是"疑似大量使用AI生成内容"。她哭着说&#xff1a;"我明明自己改过好几遍啊&#xff0c;为什么还是被查出来了&#xff1f;" 这场景我太熟悉了。去年我自己也经历过&#…

Java毕设项目推荐-基于springboot+vue的全国走失儿童认领与登记系统【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

工控人注意了:Windows近期系统更新会导致你电脑的西门子软件TIA Portal 无法使用,你中招了吗?

工控人注意了:Windows近期系统更新会导致你电脑的西门子软件TIA Portal 无法使用,你中招了吗?一、问题点 注意! 注意! 注意! 近期由于Microsoft Windows 推送了安全更新(KB5058411),由于很多西门子SIEMENS 用户…

开箱即用的番茄叶片病害识别平台|YOLOv8+PyQt5实战指南

基开箱即用的番茄叶片病害识别平台&#xff5c;YOLOv8PyQt5实战指南 随着人工智能技术在农业领域的应用不断深入&#xff0c;作物病害识别正迎来全新的智能化解决方案。番茄作为全球广泛种植的重要经济作物&#xff0c;其叶片病害种类繁多、症状复杂&#xff0c;相似病症常导致…

计算机Java毕设实战-基于springboot的走失儿童认领与登记系统基于springboot+vue的javaweb宝贝回家走失儿童报备【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

学生党必看:3步轻松改写AI文献综述,教你如何用AI把AI率从80%降到5%!

最近不少同学私信我&#xff0c;说论文的AI率高得离谱。 用AI写的文献综述&#xff0c;看起来逻辑完美&#xff0c;排版工整&#xff0c;可检测一跑——AI率80%。 其实问题不在AI&#xff0c;而在“太像AI”。 AI写的内容没有错&#xff0c;只是写得太“顺”&#xff0c;太“像…

强烈安利MBA必备TOP8 AI论文软件

强烈安利MBA必备TOP8 AI论文软件 2026年MBA学术写作工具测评&#xff1a;为何值得一看 在MBA学习与研究过程中&#xff0c;论文撰写是一项不可或缺的环节&#xff0c;但同时也伴随着诸多挑战。从选题构思到文献综述&#xff0c;从数据整理到格式规范&#xff0c;每一个步骤都可…

基于SpringBoot+Vue医疗陪护服务平台的设计与实现

博主主页&#xff1a;一点素材 博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬…

Java计算机毕设之基于springboot+vue的走失儿童认领与登记系统基于SpringBoot的宝贝回家走失儿童报备系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【第1章>第17节】图像黒色顶帽理论分析与MATLAB仿真测试

目录 1.黑色顶帽的核心原理 2.图像黒色顶帽运算的MATLAB仿真测试 欢迎订阅FPGA图像处理算法开发教程 《FPGA图像处理算法开发学习教程》 黑色顶帽(Black Top-hat)是形态学变换的重要分支,在工业检测、医学影像、遥感图像分析等领域有着广泛的应用。黑色顶帽变换用于增…

AI与Python双驱动计量经济学多源数据处理、机器学习预测及复杂因果识别

随着数字经济时代的全面到来&#xff0c;经济学与管理学的研究范式正经历着一场深刻的“数据革命”。传统的计量经济学模型虽然在因果推断方面具有严谨的理论基础&#xff0c;但在面对海量、高维、非标准化、非结构化数据&#xff08;如文本、图像&#xff09;时&#xff0c;往…

Java网络编程:InetAddress 详解

基本概念InetAddress 是 Java 网络编程 中用于表示 IP 地址&#xff08;IPv4 或 IPv6&#xff09;的核心类&#xff0c;位于 java.net 包中。它封装了 IP 地址与主机名 的映射关系&#xff0c;并提供了多种静态方法来获取本地或远程主机的地址信息。相关方法1.获取本机 InetAdr…

论文AI率过高被警告?学生党的急救方案:降AI工具一键改写,亲测有效!

最近不少同学私信我&#xff0c;说论文的AI率高得离谱。 用AI写的文献综述&#xff0c;看起来逻辑完美&#xff0c;排版工整&#xff0c;可检测一跑——AI率80%。 其实问题不在AI&#xff0c;而在“太像AI”。 AI写的内容没有错&#xff0c;只是写得太“顺”&#xff0c;太“像…

Java毕设项目:基于springboot的走失儿童认领与登记系统(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…