题目大意

有个奇数长度的 \(01\) 串 \(s\) 其中有若干位置是 \(?\)。

每次可将 \(3\) 个连续的字符替换成这三个数的中位数。

求有多少方案将 \(?\) 替换成 \(0/1\) 使得进行 \(\frac{N-1}{2}\) 次操作后的字符串是 \(1\)。

\(1 ≤ ∣S∣ ≤ 300000\)

解题思路

吐了,还想什么自己写,想了 114514 年也不懂哦

首先,对于这种求合法方案的,先看给出一个方案,怎么判断是否合法。

然后,对于这种选某一段消除/合并的,可以拿一个栈存着之前剩下的。

接下来考虑如何维护这个栈:

  • 加入一个 \(0\):

    • 栈顶有 \(2\) 个 \(0\),一个显然的贪心是把三个 \(0\) 合并成一个;
    • 否则不知道怎么办,那就把 \(0\) 放进去;
  • 加入一个 \(1\):

    • 栈顶是 \(1\),另一个显然的贪心是不妨让 \(1\) 屯起来。

    • 栈顶是 \(0\),那么有两种可能: \(0\) 或者 \(00\) (由之前的贪心,不存在三个连续的 \(0\)),这些连续的 \(0\) 前面,可能有 \(1\),也可能没有。

      咕咕咕。

不想分析了,感觉分析不清了,直接放代码 qwq。

#include <set>
#include <map>
#include <queue>
#include <bitset>
#include <vector>
#include <math.h>
#include <ctype.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std; const int N(300005), mod(1e9 + 7); int n, a[N];
int f[N][3][3];
char s[N]; inline void read(int &x){
x = 0; int f = 1, c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)) x = x * 10 + c - 48, c = getchar();
x *= f;
} inline void MOD(int &x){ x = x + ((x >> 31) & mod); }
inline void upd(int x, int I, int O, int res){ MOD(f[x][I][O] += res - mod); } int main(){
scanf("%s", s + 1), n = strlen(s + 1);
for(int i(1); i <= n; ++i) a[i] = s[i] == '?' ? -1 : s[i] - '0';
if(n == 1) return cout << (a[1] != 0) << endl, 0;
f[0][0][0] = 1;
for(int i(0); i < n; ++i)
for(int I(0); I <= 2; ++I)
for(int O(0); O <= 2; ++O){
int res = f[i][I][O];
if(a[i + 1] != 1){// a[i + 1] == 0
if(O == 2) upd(i + 1, I, 1, res);
else upd(i + 1, I, O + 1, res);
}
if(a[i + 1] != 0){// a[i + 1] == 1
if(O) upd(i + 1, I, O - 1, res);
else if(I == 2) upd(i + 1, I, O, res);
else upd(i + 1, I + 1, O, res);
}
}
int ans = 0;
for(int I(0); I <= 2; ++I)
for(int O(0); O <= 2; ++O)
if(I >= O) MOD(ans += f[n][I][O] - mod);
printf("%d\n", ans);
return 0;
}
/* Hemerocallis */

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

  1. AGC022E Median Replace

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

  2. AT3950 [AGC022E] Median Replace

    题目传送门 Description 有一个长度为 \(n\) 的 \(01\) 串,里面有一些还没有确定,我们标记为 ? .可以进行若干次操作,每次操作可以把三个相邻的数替换成它们的中位数.问有多少种 ...

  3. 《LeetBook》leetcode题解(4): Median of Two Sorted Arrays[H]——两个有序数组中值问题

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  4. PAT甲题题解-1029. Median (25)-求两序列的中位数,题目更新了之后不水了

    这个是原先AC的代码,但是目前最后一个样例会超内存,也就是开不了两个数组来保存两个序列了,意味着我们只能开一个数组来存,这就需要利用到两个数组都有序的性质了. #include <iostrea ...

  5. 【题解】CF1375D Replace by MEX

    \(\color{purple}{Link}\) \(\text{Solution:}\) 观察到题目要求操作次数不超过\(2n,\)且不必最小化操作次数,所以一定是构造题. 考虑将序列转化为\([0 ...

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

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

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

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

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

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

  9. Getting started with Kaggle -- Kaggle Competitions

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

随机推荐

  1. 去掉一个Vector集合中重复的元素?

    Vector newVector = new Vector();For (int i=0;i<vector.size();i++){Object obj = vector.get(i);     ...

  2. SpringDataRedis持续更新部分值使用方式

    官方文档:https://docs.spring.io/spring-data/redis/docs/2.3.4.RELEASE/reference/html/#redis.repositories. ...

  3. Linux常用命令-学习笔记

    Linux命令格式: 命令 [命令参数] [命令对象] # 命令之间的参数和对象用单个空格进行分割 # "[]"代表可选,{}代表必选其中的一项,|代表或者的关系,<> ...

  4. 关于XML文件

    关于xml文件没有提示(eclipse) 点我

  5. Redis缓存穿透、缓存雪崩、缓存击穿

    缓存穿透: ​ 缓存穿透,是指查询一个数据库一定不存在的数据.正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存.如果 ...

  6. 错误问题之“Apache Log4j 漏洞,在版本为包含2.14以内!”

    漏洞概述 Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器. Log4j 1.2 中包含一个 SocketServer 类,该类容易受到不可信数据反序列化的影响,当侦听 ...

  7. 【分享】WeX5的正确打开方式(6)——数据组件初探

    本文是[WeX5的正确打开方式]系列的第6篇文章,简单介绍一下WeX5中数据组件的特性和结构形式. 数据组件的由来 上一篇 WeX5绑定机制我们实现了一个简单的记账本应用,当时所有数据都用 JSON ...

  8. Nuxt.js服务端渲染实践,从开发到部署

    感悟 经过几个周六周日的尝试,终于解决了服务端渲染中的常见问题,当SEO不在是问题的时候,或许才是我们搞前端的真正的春天,其中也遇到了一些小坑,Nuxt.js官方还是很给力的,提issue后很积极的给 ...

  9. 子线程中如何修改ui界面

    1.Android进程 一个应用程序被启动时,系统默认创建执行一个叫做"main"的线程.这个线程也是你的应用与界面工具包(android.widget和android.view包 ...

  10. Android中的Preference结构的设计与实现

    本文主要通过分析源代码来分享Preference的设计和实现方式,让开发者们在今后更加顺手地使用和扩展Preference类,或者在设计其他类似的界面和功能时可以提供参考帮助. Preference概 ...