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比赛中泰坦尼克号生存率的分析.强烈建议在做这个比赛的时候,再看一遍电源<泰坦尼克号>,可能会给你一些启发,比如妇女儿童先上船等.所以是否获救其实并非随机,而是基于一 ...
随机推荐
- android activity pass data to accessibilityservice 数据传递
不同类型的 service 传递数据的方式不同,accessibilityservice 运行在独立进程,且被系统接管,比较特别 在 AccessibilityService 的 onCreate 内 ...
- linux系统配置本地yum源
1. 前言 学习Linux系统需要大量的实验,而每次安装系统和准备安装系统后的基础配置比较耗时费力.如果在生产环境中,遇到内网(无法访问互联网)情况下,就需要利用挂载的ISO文件内的Packages中 ...
- Python - 进度条库 tqdm
前言 在写生成器的时候,网上看到一个进度条库,感觉蛮有意思,记录下 这个库感觉只有在调试的时候会用到,不做深入学习 内置库,不需要安装 示例代码 from tqdm import tqdm for i ...
- Apache Hudi内核之文件标记机制深入解析
1. 摘要 Hudi 支持在写入时自动清理未成功提交的数据.Apache Hudi 在写入时引入标记机制来有效跟踪写入存储的数据文件. 在本博客中,我们将深入探讨现有直接标记文件机制的设计,并解释了其 ...
- Linux内核学习之工作队列
Author : Toney Email : vip_13031075266@163.com Date : 2020.12.02 Copyright : ...
- el-table回显遇到的坑
使用element ui 的el-table在做到复选框回显勾中的问题时,整整困惑了我一天,当时百度了一下,好多人都说是 this.$nextTick(() => {})的问提,在组件中监听w ...
- Oracle列值拼接
最近在学习的过程中,发现一个挺有意思的函数,它可实现对列值的拼接.下面我们来看看其具体用法. 用法: 对其作用,官方文档的解释如下: For a specified measure, LISTAGG ...
- mysql升级-rpm安装
mysql版本5.7.29升级到5.7.30 由于我们安装mysql的方式是通过mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar中的rpm包安装:rpm -Uvh my ...
- Python小技巧:这17个骚操作你都OK吗?
导读:Python 是一门非常优美的语言,其简洁易用令人不得不感概人生苦短.本文中带我们回顾了 17 个非常有用的 Python 技巧,例如查找.分割和合并列表等.这 17 个技巧都非常简单,但它们都 ...
- HCNP Routing&Switching之IS-IS路由聚合和认证
前文我们了解了IS-IS路由渗透和开销相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15302382.html:今天我们来聊一聊IS-IS路由聚合和认 ...