Atcoder 题面传送门 & 洛谷题面传送门

首先考虑对于固定的 01 串怎样计算它是否可以通过将三个连续的 \(0\) 或 \(1\) 替换为其中位数得到。我们考虑单调栈,新建一个栈,栈底到栈顶分别是一段连续的 \(1\) 和一段连续的 \(0\),分别表示当前未合并完的字符,我们从左往右扫描,每遇到一个字符可分以下两种情况:

  • 如果我们遇到一个 \(0\):

    • 如果栈为空,那直接将这个 \(0\) 入栈就好了。

    • 如果栈顶 \(0\) 的个数 \(\ge 2\),那么显然我们可以把三个连续的 \(0\) 合并成一个 \(0\),因为不论我们后来加入什么样的数字,这样一一合并下去最终只可能得到一个 \(0\),也就是说原来栈顶的两个 \(0\) 变成了一个 \(0\)。

    • 如果栈顶没有 \(0\),否则直接将这个 \(0\) 入栈。

  • 如果我们遇到一个 \(1\):

    • 如果栈为空,那直接将这个 \(1\) 入栈就好了。

    • 如果栈顶有 \(0\),并且栈不为空,那么栈最顶上的两个元素一定是一个 \(0\) 一个 \(1\),而显然如果第一个数是 \(0\),第二个数是 \(1\),那第三个数不论是多少,取中位数得到的结果一定还是第三个数,所以我们索性将最开头的 \(01\) 抵消,也就是说栈中 \(0\) 的个数减少了 \(1\),此时栈底到栈顶还是一段连续的 \(1\) 和一段连续的 \(0\)。

    • 否则,栈中一定只剩一段连续的 \(1\)。如果这段 \(1\) 的个数 \(\ge 3\),仿照之前的推理过程它可以等效于 \(3\) 个 \(1\),否则我们就直接将 \(1\) 入栈。

显然最终栈不为空,并且该 01 串 \(s\) 满足条件的充要条件是最后 \(1\) 的个数大于 \(0\) 的个数,因为如果在合并过程中不存在栈中剩余 \(\ge 3\) 个 \(1\),并且又进来了一个 \(1\) 的情况,那么每次操作栈内数的个数要么 \(+1\) 要么 \(-1\),而 \(n\) 为奇数,故最后栈中剩余数的个数是奇数。如果只剩一个 \(1\) 那就直接满足条件了,如果剩 \(2\) 个 \(1\) 一个 \(0\) 或者 \(3\) 个 \(1\) 把这三个数合并一下即可,如果剩 \(3\) 个 \(1\) 两个 \(0\) 根据抽屉原理一定存在连续的三个数中恰好有 \(2\) 个 \(1\),把这三个数合并得到一个 \(1\),再把剩下三个数合并即可。如果在合并过程中存在栈中剩余 \(\ge 3\) 个 \(1\),并且又进来了一个 \(1\) 的情况,那么最终这三个 \(1\) 一定不会被消掉,也就是说最终 \(1\) 的个数为 \(3\),严格大于 \(0\) 的个数的最大值 \(2\),也符合题意。

接下来考虑原题。不难发现任何时刻单调栈中 \(1\) 的个数 \(\le 3\),\(0\) 的个数 \(\le 2\),也就是说本质不同的单调栈的个数 \(\le 12\)。我们考虑将单调栈放入 DP 状态中,即设 \(dp_{i,x,y}\) 表示考虑到第 \(i\) 个字符,单调栈中还剩 \(x\) 个 \(0\) 和 \(y\) 个 \(1\) 的方案数。分该位填 \(0\) 和该位填 \(1\) 转移即可。复杂度线性。

const int MAXN=3e5;
const int MOD=1e9+7;
int n,dp[MAXN+5][3][4];char s[MAXN+5];
void add(int &x,int v){((x+=v)>=MOD)&&(x-=MOD);}
int main(){
scanf("%s",s+1);n=strlen(s+1);dp[0][0][0]=1;
for(int i=0;i<n;i++) for(int c0=0;c0<3;c0++) for(int c1=0;c1<4;c1++){
if(s[i+1]!='1'){//digit 0
if(c0==2) add(dp[i+1][1][c1],dp[i][c0][c1]);
else add(dp[i+1][c0+1][c1],dp[i][c0][c1]);
} if(s[i+1]!='0'){//digit 1
if(c0) add(dp[i+1][c0-1][c1],dp[i][c0][c1]);
else add(dp[i+1][c0][min(c1+1,3)],dp[i][c0][c1]);
}
} int ans=0;
for(int c1=1;c1<=3;c1++) for(int c0=0;c0<c1;c0++)
add(ans,dp[n][c0][c1]);
printf("%d\n",ans);
return 0;
}

Atcoder Grand Contest 022 E - Median Replace(dp)的更多相关文章

  1. Atcoder Grand Contest 002 F - Leftmost Ball(dp)

    Atcoder 题面传送门 & 洛谷题面传送门 这道 Cu 的 AGC F 竟然被我自己想出来了!!!((( 首先考虑什么样的序列会被统计入答案.稍微手玩几组数据即可发现,一个颜色序列 \(c ...

  2. AtCoder Grand Contest 032 A - Limited Insertion( 思维)

    Time Limit: 2 sec / Memory Limit: 1024 MB Score : 400400 points Problem Statement Snuke has an empty ...

  3. Atcoder Grand Contest 006 D - Median Pyramid Hard(二分+思维)

    Atcoder 题面传送门 & 洛谷题面传送门 u1s1 Atcoder 不少思维题是真的想不出来,尽管在 Atcoder 上难度并不高 二分答案(这我倒是想到了),检验最上面一层的数是否 \ ...

  4. Atcoder Grand Contest 001 F - Wide Swap(拓扑排序)

    Atcoder 题面传送门 & 洛谷题面传送门 咦?鸽子 tzc 来补题解了?奇迹奇迹( 首先考虑什么样的排列可以得到.我们考虑 \(p\) 的逆排列 \(q\),那么每次操作的过程从逆排列的 ...

  5. Atcoder Grand Contest 038 F - Two Permutations(集合划分模型+最小割)

    洛谷题面传送门 & Atcoder 题面传送门 好久前做的题了--今天偶然想起来要补个题解 首先考虑排列 \(A_i\) 要么等于 \(i\),要么等于 \(P_i\) 这个条件有什么用.我们 ...

  6. Atcoder Grand Contest 013 E - Placing Squares(组合意义转化+矩阵快速幂/代数推导,思维题)

    Atcoder 题面传送门 & 洛谷题面传送门 这是一道难度 Cu 的 AGC E,碰到这种思维题我只能说:not for me,thx 然鹅似乎 ycx 把题看错了? 首先这个平方与乘法比较 ...

  7. Atcoder Grand Contest 032 E - Modulo Pairing(乱搞+二分)

    Atcoder 题面传送门 & 洛谷题面传送门 神仙调整+乱搞题. 首先某些人(including me)一看到最大值最小就二分答案,事实上二分答案对这题正解没有任何启发. 首先将 \(a_i ...

  8. 题解——ATCoder AtCoder Grand Contest 017 B - Moderate Differences(数学,构造)

    题面 B - Moderate Differences Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Stat ...

  9. AtCoder Grand Contest 022

    A - Diverse Word Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement Gotou ...

随机推荐

  1. Less-23 preg_replace1

    Less-23: 直接跳到Less-23的原因是,Less-(11~22)均为注入点不为get方式的注入.我先把get型注入写的差不多,再回来整理关于注入点的内容. 核心语句: 查询.报错均有回显. ...

  2. (四)、Docker 镜像

    1.Docker镜像是什么? 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. 2.Do ...

  3. 【linux】修改ip后hadoop只有四个节点的问题

    学校的机房,每重启一次就会将虚拟机的某些配置还原到部署到学生机时候的状态(例如.etc/hosts文件中ip与主机名的映射),这个时候与我们前面所部署的hadoop就会产生IP不对应的状态,导致了ha ...

  4. hdu 1503 Advanced Fruits(DP)

    题意: 将两个英文单词进行合并.[最长公共子串只要保留一份] 输出合并后的英文单词. 思路: 求最长公共子串. 记录路径: mark[i][j]=-1:从mark[i-1][j]转移而来. mark[ ...

  5. cf 11B Jumping Jack(贪心,数学证明一下,,)

    题意: 给一个数X. 起始点为坐标0.第1步跳1格,第2步跳2格,第3步跳3格,.....以此类推. 每次可以向左跳或向右跳. 问最少跳几步可以到坐标X. 思路: 假设X是正数. 最快逼近X的方法是不 ...

  6. 第36篇-return字节码指令

    方法返回的字节码相关指令如下表所示. 0xac ireturn 从当前方法返回int 0xad lreturn 从当前方法返回long 0xae freturn 从当前方法返回float 0xaf d ...

  7. 新手使用python以及pycharm看过来

    前言 随着互联网时代的进步,人类与计算机之前的沟通交流越来越便捷,自此交流的媒介--编程语言吸引力更多的人学习,今天我们就来谈谈当前市面上最火的编程语言 1.文件的概念 什么是文件夹.文件 其实是操作 ...

  8. sql注入理解

    一.SQL注入产生的原因和危害 1.原因 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序.而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原 ...

  9. 【编译原理】LL1文法语法分析器

    上篇文章[编译原理]语法分析--自上向下分析 分析了LL1语法,文章最后说给出栗子,现在补上去. 说明: 这个语法分析器是利用LL1分析方法实现的. 预测分析表和终结符以及非终结符都是针对一个特定文法 ...

  10. kubernetes常见命令

    kubernetes命令 kubectl get pod --all-namespaces查看pod节点 kubectl delete -n service/pods/deplay 删除指定内容 ku ...