题目传送门

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. opencv入门系列教学(五)图像的基本操作(像素值、属性、ROI和边框)

    0.序言 每个图像是由一个个点组成的,而这些点可以表示为像素值的形式. 这篇博客里我们将学会: 访问像素值并修改它们 . 访问图像属性 . 设置感兴趣区域(ROI) . 分割和合并图像. 对于图像的基 ...

  2. mybatis第一个程序随笔

    今天继续学习了解如何写一个mybatis程序 创建了Dao层 1.1 创建一个UserDao接口 1.2 创建UserMapper.xml文件 在mybaits中文手册查找配置信息 <?xml ...

  3. n个容器取油问题再探

    在 韩信分油问题的拓展分析 里,最后给出了一般性的结论,即: 用 n (n > 1) 个不规则无刻度的容器从一个无穷大的油桶里取油,这些容器容量都为整数升,分别记为 a1, a2, ..., a ...

  4. SQLServer数据实时同步PostgreSQL

    SQLServer数据实时同步至PostgreSQL 前言: 为迎合工作需求有时候传送的数据保存在SQLServer中但由于工作需要需要保存到PostgreSQL中进行处理,本文主要通过在SQLSer ...

  5. throw关键字

    1.基础用法 2.方法中加合法校验,告知方法的调用者 数组越界判断 3.一切皆为对象,创建的是运行期对象,则可以不处理(throws/try catch),直接交给JVM处理(打印并终止程序) 4.O ...

  6. java版gRPC实战之二:服务发布和调用

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

  7. freeswitch的网关配置

    vim  /usr/local/freeswitch/conf/sip_profiles/external/weihu1.xml 1 <!-- 点对点式 --> 2 <!-- 3 & ...

  8. 在C++11编译环境中,简单自测了一下C++标准库中的string/vector和迭代器,记录一下

    #include <iostream> #include <vector> using namespace std; int main() { //////////////// ...

  9. mysql触发器实时检测一条语句进行备份删除

    问题描述:用户有一个这样一个需求,在一张表里会不时出现 "违规" 字样的字段,需要在出现这个字段的时候,把整行的数据删掉.这是个采集任务,如果发现有"违规"字样 ...

  10. 反转链表middle

    eg: 输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]相关解法:图解: /** * Definition for singly-li ...