AT3950 [AGC022E] Median Replace
Description
有一个长度为 \(n\) 的 \(01\) 串,里面有一些还没有确定,我们标记为 ? 。可以进行若干次操作,每次操作可以把三个相邻的数替换成它们的中位数。问有多少种把 ? 填为 0/1的方法使得该 \(01\) 串最后能变为 \(1\) 。
Solution
我们先考虑如何判断一个 \(01\) 串是否合法。
可以想到的是,我们的 \(000\) 一定要先删掉。然后考虑 \(01,10\) ,因为如果出现这两个,那么无论再有 \(0,1\) 都由新加入的值决定,所以可以直接删去。最后考虑 \(111\)。
我们如果用栈来处理。就是:
- 如果当前值为 \(1\)
如果栈顶为 \(0\),则删去栈顶。如果栈顶为 \(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的更多相关文章
- AGC022E Median Replace
题意 给出一个长度为奇数\(n\)的残缺01串,问有多少种补全方法,每次将连续三个位替换为它们的中位数后,能有一种方案使它变为1. \(n \le 3*10^5\) 思路 左边表示栈顶. 将操作简化为 ...
- [题解] [AGC022E] Median Replace
题目大意 有个奇数长度的 \(01\) 串 \(s\) 其中有若干位置是 \(?\). 每次可将 \(3\) 个连续的字符替换成这三个数的中位数. 求有多少方案将 \(?\) 替换成 \(0/1\) ...
- AT3950-[AGC022E]Median Replace【贪心,dp】
正题 题目链接:https://www.luogu.com.cn/problem/AT3950 题目大意 一个包含\(?,0,1\)的长度为奇数的序列,把\(?\)替换为\(0/1\).每次可以选择三 ...
- Atcoder Grand Contest 022 E - Median Replace(dp)
Atcoder 题面传送门 & 洛谷题面传送门 首先考虑对于固定的 01 串怎样计算它是否可以通过将三个连续的 \(0\) 或 \(1\) 替换为其中位数得到.我们考虑单调栈,新建一个栈,栈底 ...
- 原生js去掉所有的html标签,最终得到HTML标签中的所有内容
替换掉所有的 html标签,最终得到Html标签中的内容 <script> //替换掉所有的 html标签,最终得到Html标签中的内容 var req="<div sty ...
- Getting started with Kaggle -- Kaggle Competitions
1: The Competition We'll be learning how to generate a submission for a Kaggle competition. Kaggle i ...
- 【AtCoder】AGC022
A - Diverse Word 不到26位就加上一个最小的 到26位了就搜一下,最多回溯就一次,所以复杂度不大 #include <iostream> #include <cstd ...
- kaggle Titanic
# coding: utf-8 # In[19]: # 0.78468 # In[20]: import numpy as np import pandas as pd import warnings ...
- Kaggle入门——泰坦尼克号生还者预测
前言 这个是Kaggle比赛中泰坦尼克号生存率的分析.强烈建议在做这个比赛的时候,再看一遍电源<泰坦尼克号>,可能会给你一些启发,比如妇女儿童先上船等.所以是否获救其实并非随机,而是基于一 ...
随机推荐
- Python的GPU编程实例——近邻表计算
技术背景 GPU加速是现代工业各种场景中非常常用的一种技术,这得益于GPU计算的高度并行化.在Python中存在有多种GPU并行优化的解决方案,包括之前的博客中提到的cupy.pycuda和numba ...
- mongodb重启报错解决
mongodb关闭后重启失败 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName= ...
- redis《三》连接池配置参数
参数 值 setTestWhileIdle() 在空闲时检查有效性 true setMinEvictableIdleTimeMillis() 连接最小空闲时间 1800000L setTimeBetw ...
- mysql8.0----mysqldump抛出:Unknown table 'COLUMN_STATISTICS' in information_schema (1109)
问题:我尝试使用mysqldump时,得到以下错误: 复制 $> mysqldump --single-transaction --h -u user -p db > db.sql my ...
- Python - 面向对象编程 - 三大特性之封装
简单介绍封装 封装是面向对象编程的一大特点 封装可以被认为是一个保护屏障,防止该类的属性.方法和数据结构被外部随意访问 要访问该类的属性.私有方法.数据结构,必须由指定的方法控制访问 深入理解封装 在 ...
- word文档转成图片
1:先把word文档转成pdf格式 这个是在word中转成pdf格式,保存好 2:再把pdf格式转成图片 在这个链接中打开https://smallpdf.com/cn/pdf-converter, ...
- jq给动态标签绑定事件
$(document).on("click", ".autocompleteDiv .autocomplete_ul li", function () { lo ...
- Java一般命名规范
一.项目名称 最好用英文,所有单词全部用小写,如testjavaproject.studentmanagement等,当然也也可以用中文,如"学生管理系统"等. 二.Java pr ...
- Docker安装GitLab与Runner(网关),常规设置,自动化用到k8s+token
[转]图文详解k8s自动化持续集成之GitLab CI/CD Windows里面使用Debian命令行工具完成 和Docker网络相关的命令 查看某一个容器的网络 docker inspect 容器I ...
- 羽夏看Win系统内核——简述
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...