题目传送门

Description

有一个长度为 \(n\) 的 \(01\) 串,里面有一些还没有确定,我们标记为 ? 。可以进行若干次操作,每次操作可以把三个相邻的数替换成它们的中位数。问有多少种把 ? 填为 0/1的方法使得该 \(01\) 串最后能变为 \(1\) 。

Solution

我们先考虑如何判断一个 \(01\) 串是否合法。

可以想到的是,我们的 \(000\) 一定要先删掉。然后考虑 \(01,10\) ,因为如果出现这两个,那么无论再有 \(0,1\) 都由新加入的值决定,所以可以直接删去。最后考虑 \(111\)。

我们如果用栈来处理。就是:

  1. 如果当前值为 \(1\)

如果栈顶为 \(0\),则删去栈顶。如果栈顶为 \(1\) 且栈顶下一个不是 \(1\),就加入,否则不管

  1. 如果当前值为 \(0\)

如果栈顶有两个 \(0\) 就直接删掉一个栈顶,否则就直接加入。至于不管栈顶为 \(1\) 的情况是因为我们需要先处理 \(000\) 而不是 \(10,01\)。


于是我们就可以考虑用 dp 解决这个问题。我们设 \(f_{i,j,k}\) 表示前面 \(i\) 个数,栈有 \(j\) 个 \(1\),\(k\) 个 \(0\)。可以看出的是我们栈的形态从栈底到栈顶一定是一段 \(1\) 加上一段 \(0\)。因为如果有 \(01\) 的存在就一定会直接删掉。而且,\(0,1\) 的个数都不会超过 \(2\),因为超过就会被删掉或者没有意义了。转移按上面的方法转移即可。

Code

#include <bits/stdc++.h>
using namespace std; #define Int register int
#define MAXN 300005 template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');} char s[MAXN];
int n,f[MAXN][4][4]; #define mod 1000000007
int add (int &a,int b){return a = a + b >= mod ? a + b - mod : a + b;} signed main(){
scanf ("%s",s + 1),n = strlen (s + 1),f[0][0][0] = 1;
for (Int i = 0;i < n;++ i){
for (Int j = 0;j < 3;++ j)
for (Int k = 0;k < 3;++ k){
if (s[i + 1] != '0'){
if (k) add (f[i + 1][j][k - 1],f[i][j][k]);
else add (f[i + 1][min (j + 1,2)][k],f[i][j][k]);
}
if (s[i + 1] != '1'){
if (k == 2) add (f[i + 1][j][1],f[i][j][k]);
else add (f[i + 1][j][k + 1],f[i][j][k]);
}
}
}
int ans = 0;
for (Int i = 0;i < 3;++ i)
for (Int j = 0;j <= i;++ j)
add (ans,f[n][i][j]);
write (ans),putchar ('\n');
return 0;
}

AT3950 [AGC022E] Median Replace的更多相关文章

  1. AGC022E Median Replace

    题意 给出一个长度为奇数\(n\)的残缺01串,问有多少种补全方法,每次将连续三个位替换为它们的中位数后,能有一种方案使它变为1. \(n \le 3*10^5\) 思路 左边表示栈顶. 将操作简化为 ...

  2. [题解] [AGC022E] Median Replace

    题目大意 有个奇数长度的 \(01\) 串 \(s\) 其中有若干位置是 \(?\). 每次可将 \(3\) 个连续的字符替换成这三个数的中位数. 求有多少方案将 \(?\) 替换成 \(0/1\) ...

  3. AT3950-[AGC022E]Median Replace【贪心,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/AT3950 题目大意 一个包含\(?,0,1\)的长度为奇数的序列,把\(?\)替换为\(0/1\).每次可以选择三 ...

  4. Atcoder Grand Contest 022 E - Median Replace(dp)

    Atcoder 题面传送门 & 洛谷题面传送门 首先考虑对于固定的 01 串怎样计算它是否可以通过将三个连续的 \(0\) 或 \(1\) 替换为其中位数得到.我们考虑单调栈,新建一个栈,栈底 ...

  5. 原生js去掉所有的html标签,最终得到HTML标签中的所有内容

    替换掉所有的 html标签,最终得到Html标签中的内容 <script> //替换掉所有的 html标签,最终得到Html标签中的内容 var req="<div sty ...

  6. Getting started with Kaggle -- Kaggle Competitions

    1: The Competition We'll be learning how to generate a submission for a Kaggle competition. Kaggle i ...

  7. 【AtCoder】AGC022

    A - Diverse Word 不到26位就加上一个最小的 到26位了就搜一下,最多回溯就一次,所以复杂度不大 #include <iostream> #include <cstd ...

  8. kaggle Titanic

    # coding: utf-8 # In[19]: # 0.78468 # In[20]: import numpy as np import pandas as pd import warnings ...

  9. Kaggle入门——泰坦尼克号生还者预测

    前言 这个是Kaggle比赛中泰坦尼克号生存率的分析.强烈建议在做这个比赛的时候,再看一遍电源<泰坦尼克号>,可能会给你一些启发,比如妇女儿童先上船等.所以是否获救其实并非随机,而是基于一 ...

随机推荐

  1. myScript调研,电子手写板使用,纯干货

    第二天进公司,就叫我调研myScript作为手写板的可行性,又不能不做,哎~ myScript效果十分的奈斯,前端用canvas手写的文字.数学字符,都可以识别然后转换,不知道myScript是不是你 ...

  2. opencv入门系列教学(六)图像上的算术运算(加法、融合、按位运算)

    0.序言 这一篇博客我们将学习图像的几种算术运算,例如加法,减法,按位运算等. 1.图像加法 我们可以通过OpenCV函数 cv.add() 或仅通过numpy操作 res=img1+img2 res ...

  3. 《网页布局基础篇》HTML+CSS单列布局--水平居中,垂直居中,水平垂直居中

    https://blog.csdn.net/panlu666_pl/article/details/66480433 一.水平居中 子元素在父元素中水平居中 1.使用 text-align和inlin ...

  4. Qt5-调试器安装

    这周末正好有空,我好好研究了下如何给Qt安装调试器.我们在windows下一般安装两种Qt版本,一种是基于Visual Stuido编译器的(MSVC),另一种是基于g++的MinGW.使用后者一般调 ...

  5. golang 模板 html/template与text/template

    html模板生成: html/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出.它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用t ...

  6. client-go实战之三:Clientset

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. 2021.9.12周六PAT甲级考试复盘与总结

    周六PAT甲级考试复盘与总结 先说结论:仍未步入"高手"行列:现在的学习节奏与方法是对的,有十万分的必要坚持下去. 题目 知识点 分数 T1 前缀和.二分 11 / 20 T2 排 ...

  8. SQL-DELETE触发器练习

    &练习一 如下所示三张表( student,grade,student_updata_before ): student表 grade表 Student_update_before表 # 触发 ...

  9. SpringSecurity-Shiro-初见

    目录 简介 实战环境搭建 SpringSecurity 认证和授权 权限控制和注销 记住我 Shiro 快速上手 shiro整合mybais 简介 在 Web 开发中,安全一直是非常重要的一个方面. ...

  10. WinUI 3学习笔记(3)—— ComboBox & DropDownButton & SplitButton

    本篇想介绍相对小众但颇具使用价值的控件SplitButton,提到SplitButton难免会拿来与ComboBox进行比较,同时在WinUI 3的控件库中,还有一个默默无闻的DropDownButt ...