题目链接

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\) 的自动机(01 均为 \(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 (字符串、自动机、贪心、计数)相关推荐

  1. AGC022E - Median Replace

    AGC022E - Median Replace 题面描述 Solution 直接构造自动机,模拟每次在末尾加一个字符的当前状态的方案数f[state]f[state]f[state],状态很少,直接 ...

  2. AtCoder3950 [AGC022E] Median Replace(DFA + dp)

    problem solution 可以从 DFA\text{DFA}DFA 的思想来考虑这道题. 考虑建一个 DFA\text{DFA}DFA 只接受最后可以变成字符串 111 的原串. 因为每次是选 ...

  3. python3.6 str.replace() 字符串替换方法

    python3.6 str.replace() 字符串替换方法 源码 def replace(self, old, new, count=None): # real signature unknown ...

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

    正题 题目链接:https://www.luogu.com.cn/problem/AT3950 题目大意 一个包含?,0,1?,0,1?,0,1的长度为奇数的序列,把???替换为0/10/10/1.每 ...

  5. golang strings Replace 字符串替换

    函数声明为: func Replace(s, old, new string, n int) string 官方描述为:返回将s中前n个不重叠old子串都替换为new的新字符串,如果n<0会替换 ...

  6. AtCoder AGC043D Merge Triplets (DP、组合计数)

    题目链接 https://atcoder.jp/contests/agc043/tasks/agc043_d 题解 考场上想到正确做法,然后思考实现细节的时候做法逐渐扭曲,最后GG--考后睡了一觉冷静 ...

  7. AtCoder AGC002F Leftmost Ball (DP、组合计数)

    题目链接: https://atcoder.jp/contests/agc002/tasks/agc002_f 题解: 讲一下官方题解的做法: 就是求那个图(官方题解里的)的拓扑序个数,设\(dp[i ...

  8. [2021.1.31多校省选模拟12]随机变换的子串(线段树维护分治/字符串/自动机思想)

    [2021.1.31多校省选模拟12]随机变换的子串 对于这三种操作,我们惊奇地发现有这样的性质,所有长度大于4的字符串都可以通过变换变为长度小于等于4的字符串,那么查询本质不同的字符串我们只需要处理 ...

  9. 【51Nod - 1182】完美字符串(贪心,字符串)

    题干: 约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数. 约翰不在乎字母大小写(也就是说字母A和a的完美度相 ...

最新文章

  1. BATJ 常考的 21 条 Linux 命令
  2. leetcode解题报告:198 House Robber
  3. 华为swot分析2020_2020华为音频产品汇总分析,完善产品质量,丰富产品线
  4. 工业机器人用铸铁牌号_常用铸铁牌号
  5. Font Awesome 中文网
  6. 創世記(一): 一至三章
  7. .NET常见错误大全
  8. mvc路由原理 php_PHP实战002:CodeIgniter安装和入门使用
  9. ubuntu 16源码安装zabbix4.2
  10. 浅谈WebView利用localStore websql和IndexDB 来存储数据
  11. BIGEMAP教您如何选择分度带(中央子午线)
  12. web编程1–用户注册之文本框应用,coon连接,存入mysql
  13. 华为 eNSP启动设备AR1失败 错误代码40
  14. java实现微软文本转语音(TTS)经验总结
  15. mysql 右连接(right join)
  16. Windows科普:正版盗版系统有何不同?
  17. 用记事本编写小游戏_一款适合你的记事本——提高你工作的效率!
  18. 使用WLW 写博客的测试
  19. PL/SQL中的dual表含义和用法
  20. 天梯赛习题:福到了(递归打印)

热门文章

  1. 谈大学教育2018-01-12
  2. 《蓝桥小记》 2018-04-01
  3. 今日机器学习概念:感知机模型
  4. Delphi的笔记整理(一)
  5. python canvas获取的图片流数据为空
  6. Maven学习笔记(二)
  7. Java对象析构_c++之对象构造顺序和销毁(析构函数)
  8. 一种绕过Android P对非SDK接口限制的简单方法
  9. 揭开知识库问答KB-QA的面纱2·语义解析篇
  10. EOS声称的每秒百万级的交易速度靠谱么?