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比赛中泰坦尼克号生存率的分析.强烈建议在做这个比赛的时候,再看一遍电源<泰坦尼克号>,可能会给你一些启发,比如妇女儿童先上船等.所以是否获救其实并非随机,而是基于一 ...
随机推荐
- myScript调研,电子手写板使用,纯干货
第二天进公司,就叫我调研myScript作为手写板的可行性,又不能不做,哎~ myScript效果十分的奈斯,前端用canvas手写的文字.数学字符,都可以识别然后转换,不知道myScript是不是你 ...
- opencv入门系列教学(六)图像上的算术运算(加法、融合、按位运算)
0.序言 这一篇博客我们将学习图像的几种算术运算,例如加法,减法,按位运算等. 1.图像加法 我们可以通过OpenCV函数 cv.add() 或仅通过numpy操作 res=img1+img2 res ...
- 《网页布局基础篇》HTML+CSS单列布局--水平居中,垂直居中,水平垂直居中
https://blog.csdn.net/panlu666_pl/article/details/66480433 一.水平居中 子元素在父元素中水平居中 1.使用 text-align和inlin ...
- Qt5-调试器安装
这周末正好有空,我好好研究了下如何给Qt安装调试器.我们在windows下一般安装两种Qt版本,一种是基于Visual Stuido编译器的(MSVC),另一种是基于g++的MinGW.使用后者一般调 ...
- golang 模板 html/template与text/template
html模板生成: html/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出.它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用t ...
- client-go实战之三:Clientset
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 2021.9.12周六PAT甲级考试复盘与总结
周六PAT甲级考试复盘与总结 先说结论:仍未步入"高手"行列:现在的学习节奏与方法是对的,有十万分的必要坚持下去. 题目 知识点 分数 T1 前缀和.二分 11 / 20 T2 排 ...
- SQL-DELETE触发器练习
&练习一 如下所示三张表( student,grade,student_updata_before ): student表 grade表 Student_update_before表 # 触发 ...
- SpringSecurity-Shiro-初见
目录 简介 实战环境搭建 SpringSecurity 认证和授权 权限控制和注销 记住我 Shiro 快速上手 shiro整合mybais 简介 在 Web 开发中,安全一直是非常重要的一个方面. ...
- WinUI 3学习笔记(3)—— ComboBox & DropDownButton & SplitButton
本篇想介绍相对小众但颇具使用价值的控件SplitButton,提到SplitButton难免会拿来与ComboBox进行比较,同时在WinUI 3的控件库中,还有一个默默无闻的DropDownButt ...