B - Three Religions

思路:dp

dp[i][j][k]:a的前i个和b的前j个和c的前k个能构成的最前面的位置

删字符时状态不用改变,加字符时只会改变1*250*250个状态

代码:

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #pragma GCC optimize(4)
  4. #include<bits/stdc++.h>
  5. using namespace std;
  6. #define y1 y11
  7. #define fi first
  8. #define se second
  9. #define pi acos(-1.0)
  10. #define LL long long
  11. #define ls rt<<1, l, m
  12. #define rs rt<<1|1, m+1, r
  13. //#define mp make_pair
  14. #define pb push_back
  15. #define ULL unsigned LL
  16. #define pll pair<LL, LL>
  17. #define pli pair<LL, int>
  18. #define pii pair<int, int>
  19. #define piii pair<pii, int>
  20. #define pdi pair<double, int>
  21. #define pdd pair<double, double>
  22. #define mem(a, b) memset(a, b, sizeof(a))
  23. #define debug(x) cerr << #x << " = " << x << "\n";
  24. #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  25. //head
  26.  
  27. const int N = 1e5 + ;
  28. char s[N];
  29. int nxt[N][], n, q, x;
  30. char op[], cc[];
  31. int dp[][][];
  32. string a, b, c;
  33. int main() {
  34. scanf("%d %d", &n, &q);
  35. scanf("%s", s+);
  36. for (int i = ; i < ; ++i) nxt[n+][i] = n+, nxt[n+][i] = n+;
  37. for (int i = n; i >= ; --i) {
  38. for (int j = ; j < ; ++j) {
  39. if(j == s[i]-'a') nxt[i][j] = i;
  40. else nxt[i][j] = nxt[i+][j];
  41. }
  42. }
  43. while(q--) {
  44. scanf("%s %d", op, &x);
  45. if(op[] == '+') {
  46. scanf("%s", cc);
  47. if(x == ){
  48. a.push_back(cc[]);
  49. for (int i = ; i <= b.size(); ++i) {
  50. for (int j = ; j <= c.size(); ++j) {
  51. dp[a.size()][i][j] = n+;
  52. if(a.size() > ) dp[a.size()][i][j] = min(dp[a.size()][i][j], nxt[dp[a.size()-][i][j]+][a.back()-'a']);
  53. if(i > ) dp[a.size()][i][j] = min(dp[a.size()][i][j], nxt[dp[a.size()][i-][j]+][b[i-]-'a']);
  54. if(j > ) dp[a.size()][i][j] = min(dp[a.size()][i][j], nxt[dp[a.size()][i][j-]+][c[j-]-'a']);
  55. }
  56. }
  57. }
  58. else if(x == ) {
  59. b.push_back(cc[]);
  60. for (int i = ; i <= a.size(); ++i) {
  61. for (int j = ; j <= c.size(); ++j) {
  62. dp[i][b.size()][j] = n+;
  63. if(b.size() > ) dp[i][b.size()][j] = min(dp[i][b.size()][j], nxt[dp[i][b.size()-][j]+][b.back()-'a']);
  64. if(i > ) dp[i][b.size()][j] = min(dp[i][b.size()][j], nxt[dp[i-][b.size()][j]+][a[i-]-'a']);
  65. if(j > ) dp[i][b.size()][j] = min(dp[i][b.size()][j], nxt[dp[i][b.size()][j-]+][c[j-]-'a']);
  66. }
  67. }
  68. }
  69. else if(x == ) {
  70. c.push_back(cc[]);
  71. for (int i = ; i <= a.size(); ++i) {
  72. for (int j = ; j <= b.size(); ++j) {
  73. dp[i][j][c.size()] = n+;
  74. if(c.size() > ) dp[i][j][c.size()] = min(dp[i][j][c.size()], nxt[dp[i][j][c.size()-]+][c.back()-'a']);
  75. if(i > ) dp[i][j][c.size()] = min(dp[i][j][c.size()], nxt[dp[i-][j][c.size()]+][a[i-]-'a']);
  76. if(j > ) dp[i][j][c.size()] = min(dp[i][j][c.size()], nxt[dp[i][j-][c.size()]+][b[j-]-'a']);
  77. }
  78. }
  79. }
  80. }
  81. else {
  82. if(x == ) a.pop_back();
  83. else if(x == ) b.pop_back();
  84. else if(x == ) c.pop_back();
  85. }
  86. if(dp[a.size()][b.size()][c.size()] > n) printf("NO\n");
  87. else printf("YES\n");
  88. }
  89. return ;
  90. }

Codeforces 1149 B - Three Religions的更多相关文章

  1. CodeForces - 1150 D Three Religions

    题目传送门 题解: id[ i ][ j ] 代表的是在第j个位置之后的第i个字符的位置在哪里. dp[ i ][ j ][ k ] 代表的是 第一个串匹配到第i个位置, 第二个串匹配到第j个位置, ...

  2. Codeforces Round #556 (Div. 2) - D. Three Religions(动态规划)

    Problem  Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 3000 mSec Problem Descripti ...

  3. Codeforces Round #556 (Div. 2) D. Three Religions 题解 动态规划

    题目链接:http://codeforces.com/contest/1150/problem/D 题目大意: 你有一个参考串 s 和三个装载字符串的容器 vec[0..2] ,然后还有 q 次操作, ...

  4. codeforces#1150D. Three Religions(dp+序列自动机)

    题目链接: https://codeforces.com/contest/1150/problem/D 题意: 给出长度为$n$的字符串,和$q$次询问 每次询问是,给$x$宗教增加一个字符$key$ ...

  5. Three Religions CodeForces - 1149B (字符串,dp)

    大意: 给定字符串S, 要求维护三个串, 支持在每个串末尾添加或删除字符, 询问S是否能找到三个不相交的子序列等于三个串. 暴力DP, 若不考虑动态维护的话, 可以直接$O(len^3)$处理出最少需 ...

  6. Codeforces 1050D Three Religions (dp+序列自动机)

    题意: 给一个1e5的串str,然后有三个起始空串,不超过1000次操作,对三个字符串的一个尾部加一个字符或者减一个字符,保证每个字符不会超过250 每次操作之后询问你这三个串是不是可以组成str的子 ...

  7. Codeforces Round #556 题解

    Codeforces Round #556 题解 Div.2 A Stock Arbitraging 傻逼题 Div.2 B Tiling Challenge 傻逼题 Div.1 A Prefix S ...

  8. Codeforces Round #556 (Div. 2) - C. Prefix Sum Primes(思维)

    Problem  Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 1000 mSec Problem Descripti ...

  9. Codeforces Round #556 (Div. 1)

    Codeforces Round #556 (Div. 1) A. Prefix Sum Primes 给你一堆1,2,你可以任意排序,要求你输出的数列的前缀和中质数个数最大. 发现只有\(2\)是偶 ...

随机推荐

  1. Unity爬坑记录-Sprite 相关功能Editor、打包器等无法使用

    找了好久的问题,同一个Unity,但是不同项目,一个没问题,一个出现上面情况.

  2. “但行好事 莫问前程 只问耕耘 不问收获 成功不必在我 而功力必不唐捐” 科技袁人·年终盛典——5G是科技时代非常重要的基础设施

    中国的科技实力:用数据对比展示当前中国整体科技实力在国际中的发展水平和未来的发展趋势. 主要分为基础研究和应用研究.其中基础研究通过论文数据进行对比展示,应用研究通过发明专利数据. 又分别结合当今中国 ...

  3. 编写expect程序报extra characters after close-brace错误或extra characters after close-quote,解决

    expect程序报extra characters after close-brace或extra characters after close-quote 可能原因 流程控制语句中的"{& ...

  4. 转发表(MAC表)、ARP表、路由表总结

    原文:https://cloud.tencent.com/developer/article/1173761 转发表(MAC表).ARP表.路由表总结 我是东东东   发表于我是东东强订阅 1.5K ...

  5. c++学习笔记_5

    前言:本笔记所对应的课程为中国大学mooc中北京大学的程序设计与算法(三)C++面向对象程序设计,主要供自己复习使用,且本笔记建立在会使用c和java的基础上,只针对与c和java的不同来写 继承 继 ...

  6. Docker pull php:7.1-fpm的php.ini配置修改

    今天,换了 Deepin 操作系统,开发环境是通过 Docker 搭建的,具体结构如下: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e ...

  7. c++ 行为型_备忘录模式(Memento)

    行为型_备忘录模式(Memento) 作用场景: 当意图在对象外面保存对象的内部状态,但是又不想破坏对象的封装性,就可以考虑备忘录模式. 解释: 其参与者包括 1.Memnto(备忘录,如下列Coun ...

  8. curl使用举例

    我在银行工作时,一个具体的用例:shell脚本中使用的 sendAddr=`echo http:192.168.1.100:8080/cloud-monitor/perfaddperf` SendDa ...

  9. linux利用crontab添加定时任务详解

    crontab 作用:添加,查询,删除系统计划任务的指令. [root@localhost ~]# crontab [选项]选项:    -e:    编辑crontab定时任务    -l:    ...

  10. Spark Scala当中reduceByKey的用法

    [学习笔记] /*reduceByKey(function)reduceByKey就是对元素为KV对的RDD中Key相同的元素的Value进行function的reduce操作(如前所述),因此,Ke ...