AtCoder AGC022E Median Replace (字符串、自动机、贪心、计数)
题目链接
https://atcoder.jp/contests/agc022/tasks/agc022_e
题解
感觉官方题解很神仙,听完另一种做法之后发现是自己太智障了
考虑一个串怎么样可以缩成 \(1\), 可以采取如下贪心策略:从前往后扫描整个串,同时维护一个栈。每次把新元素压入栈顶,如果栈顶出现了 000
则消去两个 0
,如果出现了 01
则直接消去。最后得到的串含有不超过 \(2\) 个0
,且一定是前若干字符为 1
后若干个字符为 0
. 不难发现原串可以缩成 1
当且仅当最后的串中 1
的个数大于 0
的个数。
因此,若 1
的个数超过 \(2\),那么一定可以缩成 1
,我们可以认为 1
的个数就是 \(2\).
那么我们可以得到一个状态数为 \(9\) 的自动机(0
和 1
均为 \(0\) 个、\(1\) 个或 \(2\) 个),在上面跑 DP 即可。
时间复杂度 \(O(n)\).
代码
#include<bits/stdc++.h>
#define llong long long
#define mkpr make_pair
#define riterator reverse_iterator
using namespace std;inline int read()
{int x = 0,f = 1; char ch = getchar();for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}return x*f;
}const int N = 3e5;
const int P = 1e9+7;
char a[N+3];
int trans[9][2] = {{3,1},{4,2},{5,2},{6,0},{7,1},{8,2},{3,3},{4,4},{5,5}};
llong dp[N+3][9];
int n;void updsum(llong &x,llong y) {x = x+y>=P?x+y-P:x+y;}int main()
{scanf("%s",a+1); n = strlen(a+1);dp[0][0] = 1ll;for(int i=1; i<=n; i++){for(int j=0; j<9; j++){if(a[i]!='1') {updsum(dp[i][trans[j][0]],dp[i-1][j]);}if(a[i]!='0') {updsum(dp[i][trans[j][1]],dp[i-1][j]);}}}llong ans = (dp[n][1]+dp[n][2]+dp[n][5]+dp[n][8])%P;printf("%lld\n",ans);return 0;
}
AtCoder AGC022E Median Replace (字符串、自动机、贪心、计数)相关推荐
- AGC022E - Median Replace
AGC022E - Median Replace 题面描述 Solution 直接构造自动机,模拟每次在末尾加一个字符的当前状态的方案数f[state]f[state]f[state],状态很少,直接 ...
- AtCoder3950 [AGC022E] Median Replace(DFA + dp)
problem solution 可以从 DFA\text{DFA}DFA 的思想来考虑这道题. 考虑建一个 DFA\text{DFA}DFA 只接受最后可以变成字符串 111 的原串. 因为每次是选 ...
- python3.6 str.replace() 字符串替换方法
python3.6 str.replace() 字符串替换方法 源码 def replace(self, old, new, count=None): # real signature unknown ...
- AT3950-[AGC022E]Median Replace【贪心,dp】
正题 题目链接:https://www.luogu.com.cn/problem/AT3950 题目大意 一个包含?,0,1?,0,1?,0,1的长度为奇数的序列,把???替换为0/10/10/1.每 ...
- golang strings Replace 字符串替换
函数声明为: func Replace(s, old, new string, n int) string 官方描述为:返回将s中前n个不重叠old子串都替换为new的新字符串,如果n<0会替换 ...
- AtCoder AGC043D Merge Triplets (DP、组合计数)
题目链接 https://atcoder.jp/contests/agc043/tasks/agc043_d 题解 考场上想到正确做法,然后思考实现细节的时候做法逐渐扭曲,最后GG--考后睡了一觉冷静 ...
- AtCoder AGC002F Leftmost Ball (DP、组合计数)
题目链接: https://atcoder.jp/contests/agc002/tasks/agc002_f 题解: 讲一下官方题解的做法: 就是求那个图(官方题解里的)的拓扑序个数,设\(dp[i ...
- [2021.1.31多校省选模拟12]随机变换的子串(线段树维护分治/字符串/自动机思想)
[2021.1.31多校省选模拟12]随机变换的子串 对于这三种操作,我们惊奇地发现有这样的性质,所有长度大于4的字符串都可以通过变换变为长度小于等于4的字符串,那么查询本质不同的字符串我们只需要处理 ...
- 【51Nod - 1182】完美字符串(贪心,字符串)
题干: 约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数. 约翰不在乎字母大小写(也就是说字母A和a的完美度相 ...
最新文章
- BATJ 常考的 21 条 Linux 命令
- leetcode解题报告:198 House Robber
- 华为swot分析2020_2020华为音频产品汇总分析,完善产品质量,丰富产品线
- 工业机器人用铸铁牌号_常用铸铁牌号
- Font Awesome 中文网
- 創世記(一): 一至三章
- .NET常见错误大全
- mvc路由原理 php_PHP实战002:CodeIgniter安装和入门使用
- ubuntu 16源码安装zabbix4.2
- 浅谈WebView利用localStore websql和IndexDB 来存储数据
- BIGEMAP教您如何选择分度带(中央子午线)
- web编程1–用户注册之文本框应用,coon连接,存入mysql
- 华为 eNSP启动设备AR1失败 错误代码40
- java实现微软文本转语音(TTS)经验总结
- mysql 右连接(right join)
- Windows科普:正版盗版系统有何不同?
- 用记事本编写小游戏_一款适合你的记事本——提高你工作的效率!
- 使用WLW 写博客的测试
- PL/SQL中的dual表含义和用法
- 天梯赛习题:福到了(递归打印)