优美的字符串

news/2025/11/26 21:36:25/文章来源:https://www.cnblogs.com/WDY-Hodur/p/19274646

Problem

Description

小X对字符串十分感兴趣。
对于一个只有0和1的字符串S,小X称其为优美的,当且仅当这个字符串最终可以通过不断的做下面的操
作变成"1":

  • 选择一个奇数 \(i(3 \le i \le |S|)\)
  • 将字符串的前i位与后面 \(|S| − i\) 位分开为 \(A\)\(B\)
  • 不断的将 \(A\) 的后三位替换成 0 或者 1,具体的替换规则为将后三位看成一个二进制数 \(U\),将他们替换成 \(f(U)\)。直到将 \(A\) 变成只剩下一位。
  • \(A\)\(B\) 拼接起来得到新的 \(S\)
    小X曾经写下了一个字符串,但现在这个字符串的某些位置已经丢失,现在小X想知道,重新在这些丢
    失的位置填上 0 或 1 后,有多少种可能能使这个字符串是优美的。由于可能性有很多,小X只需要你求出
    答案对 998244353 取模的值就好啦!

Input

第一行一个整数T,表示数据组数。
接下来每组数据第一行一个长度为8的01字符串,从前到后每一位分别为 \(f(000)\)\(f(100)\)\(f(010)\)\(f(110)\)
\(f(001)\)\(f(101)\)\(f(011)\)\(f(111)\)。第二行一个只包含 '0','1','?' 的字符串表示询问。

Output

对于每组数据输出一行,表示答案。

Sample Input 1

1
10001100
0000001

Sample Output 1

1

Sample Input 2

1
11100111
???

Sample Output 2

6

Note

对于40%数据,输入中不包含’?’。其中20%数据满足 |S| ≤ 2000。
对于其他数据,15%数据满足|S| ≤ 20,30%数据满足|S| ≤ 2000。
对于100%数据,|S| ≤ 100000,|S|为奇数。

Solution

这是一道比较经典的 DP 套 DP。

首先看到这种题,我们首先想到的是在没有问号的情况下,某一个序列是否可行。我们考虑用 DP,设 \(f_{i,a,b}\) 表示序列第 \(i\) 个元素为 \(a(a=0/1)\),前 \(i\) 个元素被化为 \(b(b=0/1)\) 是否可行。

对于每个 \(i\),一定是从 \(i-2\) 进行转移,且分为两种,第一种是前 \(i-2\) 个已经转移好后再转移到 \(i\),第二种是先合并 \(i-2,i-1,i\) 三个位置上的数,然后用合并好的数再和用 \(i-2\) 进行转移。转移方程如下:

\[f_{i,a,b}|=f_{i-2,F(s_{i-2},s_{i-1},a),b} \]

\[f_{i,a,b}|=f_{i-2,c}\times [F(c,s_{i-1},a)=b] \]

\(F\) 函数即为题目中用于合并的函数,\(a\)\(c\) 分别枚举即可。

我们发现此时判断某个序列是否可行需要用 DP 的结果来判断而非直接通过某种状态进行判断,所以我们考虑把刚刚的 DP 设置为内层状态,即将 DP 的结果设为状态,状态的转移用内层 DP,此时我们只需要一个外层 DP 来转移答案。我们观察 DP 转移方程,发现只要我们知道 \(s_{i-2},f_{i-2,0,0},f_{i-2,0,1},f_{i-2,1,0},f_{i-2,1,1},s_{i-1},s_{i}\) 后就可以得出 \(f_{i,0/1,0/1}\) 的值。那么我们用一个五维状压记录 \(s_{i-2},f_{i-2,0,0},f_{i-2,0,1},f_{i-2,1,0},f_{i-2,1,1}\) 分别的值,然后枚举 \(s_{i-1},s_{i}\) (注意枚举合法性),就可以通过内层 DP 得出这一轮的状态。设上一轮状态为 \(S\),转移后这一轮状态为 \(T\),设 \(dp_{i,S}\) 表示在第 \(i\) 个位置状态为 \(S\) 的方案数。转移如下:

\[dp_{i-2,S}\to dp_{i,T} \]

最后统计答案时注意判断状态合法性。

Code

#include<bits/stdc++.h>
#define N 100005
#define int long long
#define mod 998244353
using namespace std;int T,n;
int F[8],s[N];
int f[2][2],g[2][2],dp[N][32];
char str[N];int num(int a,int b,int c){return (a<<2)+(b<<1)+c;
}
int val(int a,int b,int c,int d,int e){return (a<<4)+(b<<3)+(c<<2)+(d<<1)+e;
}
int get_s(int sn,int si1,int si){int si2=(sn&1);g[0][0]=g[0][1]=g[1][0]=g[1][1]=0;f[0][0]=((sn>>4)&1),f[0][1]=((sn>>3)&1),f[1][0]=((sn>>2)&1),f[1][1]=((sn>>1)&1);for(int b=0;b<2;b++){for(int a=0;a<2;a++){g[a][b]|=f[F[num(si2,si1,a)]][b];for(int c=0;c<2;c++)g[a][b]|=(f[si2][c]*(F[num(c,si1,a)]==b));}}return val(g[0][0],g[0][1],g[1][0],g[1][1],si);
}signed main(){freopen("C.in","r",stdin);freopen("C.out","w",stdout);cin>>T;while(T--){char ch;for(int i=0;i<8;i++){cin>>ch;if(i==0)F[0]=ch-'0';else if(i==1)F[4]=ch-'0';else if(i==2)F[2]=ch-'0';else if(i==3)F[6]=ch-'0';else if(i==4)F[1]=ch-'0';else if(i==5)F[5]=ch-'0';else if(i==6)F[3]=ch-'0';else F[7]=ch-'0';}cin>>(str+1);n=strlen(str+1);for(int i=1;i<=n;i++){s[i]=str[i]-'0';if(s[i]!=0&&s[i]!=1)s[i]=-1;}if(s[1]!=-1)f[s[1]][s[1]]=1;else f[0][0]=f[1][1]=1;if(s[1]!=-1)dp[1][val(f[0][0],f[0][1],f[1][0],f[1][1],s[1])]=1;else dp[1][val(f[0][0],f[0][1],f[1][0],f[1][1],0)]=dp[1][val(f[0][0],f[0][1],f[1][0],f[1][1],1)]=1;for(int i=3;i<=n;i+=2){for(int sn=0;sn<32;sn++){if(!dp[i-2][sn])continue;for(int si1=0;si1<2;si1++){if(s[i-1]!=-1&&s[i-1]!=si1)continue;for(int si=0;si<2;si++){if(s[i]!=-1&&s[i]!=si)continue;int t=get_s(sn,si1,si);(dp[i][t]+=dp[i-2][sn])%=mod;}}}}int ans=0;for(int sn=0;sn<32;sn++){int si=(sn&1);if(s[n]!=-1&&s[n]!=si)continue;f[0][0]=((sn>>4)&1),f[0][1]=((sn>>3)&1),f[1][0]=((sn>>2)&1),f[1][1]=((sn>>1)&1);if(f[si][1])(ans+=dp[n][sn])%=mod;}cout<<ans<<"\n";memset(dp,0,sizeof dp);memset(f,0,sizeof f);memset(g,0,sizeof g);}return 0;
}

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

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

相关文章

【普中Hi3861开发攻略--基于鸿蒙OS】-- 第 31 章 WIFI 实验-华为 IoTDA 设备接入 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年11月不锈钢砝码,铸铁砝码,定制砝码厂家推荐,实力品牌深度解析采购无忧之选!

引言在全球工业生产与科研实验领域,砝码作为关键的计量器具,其精度与质量直接影响着各类测量结果的准确性。为了给全球用户提供客观、公正的砝码厂家参考,国际权威计量协会开展了一项全面的测评活动。该协会联合了多…

OpenHarmony与ArkUI-X的跨平台开发环境搭建细节版

OpenHarmony与ArkUI-X的跨平台开发环境搭建细节版 安装所有一切东西, 尽可能安装在英文路径位置下, 尽可能使用默认路径位置, 尽可能使用英文账户名,这样默认安装时,路径就符合上述要求,可以避免奇奇怪怪的问题 正…

五分钟教你学会MarkDown语法 - echo

MarkDown语法 推荐文本编辑器:Typora 文件后缀 xxx.md 标题 使用一个#号加空格就是一级标题 一级标题 使用两个#号加空格是二级标题 二级标题 以此类推三个#号就是三级标题甚至更多 字体样式使用 * 号可以实现字体的加…

Linux命令行与Shell脚本编程大全笔记

Linux命令行与Shell脚本编程大全笔记Linux Linux可划分为四部分: 1. Linux内核 2. GNU工具 3. 图形化桌面环境 4. 应用软件 Linux系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件, 并根…

OpenHarmony与ArkUI-X的跨平台开发环境搭建速通版

OpenHarmony与ArkUI-X的跨平台开发环境搭建速通版 ‍ 该文档于时间20251125编写, 是Windows端, 特定版本的OpenHarmony使用ArkUI-X框架跨平台开发 默认会了一些基础常识,直接操作不解释,有需要看详细版 默认会了一…

卷积神经网络的引入4 —— 局部扰动与空间结构破坏下的鲁棒性验证

在前三篇文章中,我们依次验证了:CNN 对平移等空间扰动具有天然优势 在低维灰度图(Fashion-MNIST)上,CNN 与 MLP 差距有限 在中等复杂度数据集(CIFAR-10)上,差距迅速拉大到这里,一个重要问题浮现:CNN 的优势到…

qoj 2610 题解

题意 给你 \(n\) 个二维平面上的点,初始你有一个位于 \((0, 0)\) 的退化矩形。每次你可以选择一个点,并将矩形扩张(长、宽不能减小)使得矩形包含这个点,代价为新矩形相对于原矩形多出来的那部分。你需要判断有没有…

P4158 [SCOI2009] 粉刷匠

没看到每个格子只能染一次色。。?11 于是 \(f_{i,j}\) 预处理每块木板涂 \(j\) 次色最多有多少个涂正确的,这个直接暴力枚举最后一次涂色的区间就好了。有了 \(f\) 就是简单背包了。 #include<bits/stdc++.h> …

Temperature、Top P 的原理以及两者区别

Temperature、Top P 的原理以及两者区别Posted on 2025-11-26 21:21 Java后端的Ai之路 阅读(0) 评论(0) 收藏 举报🌟 Temperature & Top P一句话总结: Temperature = AI的"胆量"(胆小→保守,大…

Python convert class list in CSV file via pandas.dataframe

import time import threading import datetime import pandas as pdclass Book():def __init__(self,id,name,author,comment,content,isbn,summary,title,topic):self.id=idself.name=nameself.author=authorself.co…

Google 新出的 Antigravity 有哪些新特性?

1、Antigravity 有哪些新功能? Google 在推出 Antigravity 之前,对市面上 Cursor、Windsurf 等竞品做了深入研究之后,总结出 AI开发者在2025年必不可少的三个核心组件: 1)编辑器体验 编辑器依然是核心,开发者需要…

RabbitMQ消息分发详解:从默认轮询到智能负载均衡 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

宇树 Qmini 双足机器人训练个人经验总结

github:https://github.com/vsislab/RoboTamer4Qmini本篇内容基于我在 AutoDL 云服务器 上对 Qmini 做完整训练与测试的实践总结,涵盖训练、可视化、策略测试、模型导出、URDF 调试等环节,并重点说明 headless(无显…

11月26日

上午离散数学马原 下午补上周马原的课

slkjflksjdklflsdkjfjlksdlkjfsflkjsd

[JOI Open 2019] 三级跳 / Triple Jump三元组等多元组/子区间/子序列问题,求极值。 例如三元组 \((a,b,c)\) 求极值,可以关注两个数 \((a,b)\),再确定 \(c\) 的范围,这样枚举 \((a,b)\) 是 \(O(n^2)\) 的。有时最优…

实用指南:文档搜索引擎搜索模块:从需求拆解到落地的全流程实现指南

实用指南:文档搜索引擎搜索模块:从需求拆解到落地的全流程实现指南2025-11-26 21:08 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto …

AI元人文实践:家庭旅游规划

这是完整版《AI元人文实践:家庭旅游规划》AI元人文实践:家庭旅游规划 从价值冲突到共识涌现的共生之旅 引言:超越决策困境的范式革命 家庭旅游规划,这一看似平常的日常活动,实则是一个多元价值交锋的微观宇宙。传…

十一月份《代码大全》观后感

在大二之前,我代码的终极追求就是“能跑就行”。只要程序能正确输出结果,代码长一点、乱一点,变量名随意一点,都无所谓。我甚至觉得花时间整理代码格式、优化结构是浪费时间,是“过度设计”。 《代码大全2》彻底重…

[KaibaMath]1026 海明码校验位数求解方法的进一步简化

本文基于[logm]+1=⌈log(m+1)⌉,对1020的结果做进一步简化。