B - Three Religions

思路:dp

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

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

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
//#define mp make_pair
#define pb push_back
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdi pair<double, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//head const int N = 1e5 + ;
char s[N];
int nxt[N][], n, q, x;
char op[], cc[];
int dp[][][];
string a, b, c;
int main() {
scanf("%d %d", &n, &q);
scanf("%s", s+);
for (int i = ; i < ; ++i) nxt[n+][i] = n+, nxt[n+][i] = n+;
for (int i = n; i >= ; --i) {
for (int j = ; j < ; ++j) {
if(j == s[i]-'a') nxt[i][j] = i;
else nxt[i][j] = nxt[i+][j];
}
}
while(q--) {
scanf("%s %d", op, &x);
if(op[] == '+') {
scanf("%s", cc);
if(x == ){
a.push_back(cc[]);
for (int i = ; i <= b.size(); ++i) {
for (int j = ; j <= c.size(); ++j) {
dp[a.size()][i][j] = n+;
if(a.size() > ) dp[a.size()][i][j] = min(dp[a.size()][i][j], nxt[dp[a.size()-][i][j]+][a.back()-'a']);
if(i > ) dp[a.size()][i][j] = min(dp[a.size()][i][j], nxt[dp[a.size()][i-][j]+][b[i-]-'a']);
if(j > ) dp[a.size()][i][j] = min(dp[a.size()][i][j], nxt[dp[a.size()][i][j-]+][c[j-]-'a']);
}
}
}
else if(x == ) {
b.push_back(cc[]);
for (int i = ; i <= a.size(); ++i) {
for (int j = ; j <= c.size(); ++j) {
dp[i][b.size()][j] = n+;
if(b.size() > ) dp[i][b.size()][j] = min(dp[i][b.size()][j], nxt[dp[i][b.size()-][j]+][b.back()-'a']);
if(i > ) dp[i][b.size()][j] = min(dp[i][b.size()][j], nxt[dp[i-][b.size()][j]+][a[i-]-'a']);
if(j > ) dp[i][b.size()][j] = min(dp[i][b.size()][j], nxt[dp[i][b.size()][j-]+][c[j-]-'a']);
}
}
}
else if(x == ) {
c.push_back(cc[]);
for (int i = ; i <= a.size(); ++i) {
for (int j = ; j <= b.size(); ++j) {
dp[i][j][c.size()] = n+;
if(c.size() > ) dp[i][j][c.size()] = min(dp[i][j][c.size()], nxt[dp[i][j][c.size()-]+][c.back()-'a']);
if(i > ) dp[i][j][c.size()] = min(dp[i][j][c.size()], nxt[dp[i-][j][c.size()]+][a[i-]-'a']);
if(j > ) dp[i][j][c.size()] = min(dp[i][j][c.size()], nxt[dp[i][j-][c.size()]+][b[j-]-'a']);
}
}
}
}
else {
if(x == ) a.pop_back();
else if(x == ) b.pop_back();
else if(x == ) c.pop_back();
}
if(dp[a.size()][b.size()][c.size()] > n) printf("NO\n");
else printf("YES\n");
}
return ;
}

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. 13 Ways Companies Do Whatsapp Marketing & Support (May 2019)

    13 Ways Companies Do Whatsapp Marketing & Support (May 2019) By Iaroslav Kudritskiy  We're livin ...

  2. OpenCV.20190628

    1.OpenCV提取ORB特征并匹配 - 简书.html(https://www.jianshu.com/p/420f8211d1cb) OpenCV提取ORB特征并匹配 - 简书.html(http ...

  3. 最新 汇量科技java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 汇量科技等10家互联网公司的校招Offer,因为某些自身原因最终选择了 汇量科技.6.7月主要是做系统复习.项目复盘.Le ...

  4. Python基础总结之初步认识---class类(中)。第十四天开始(新手可相互督促)

    昨天简单的认识类怎么定义,什么是类,类如何调用.今天的笔记会大概补充一些内容,明天的笔记会细致讲解,加深个印象即可 今天我们在了解下:类的属性,类属性属于类也属于实例化对象.也就是说类的实例化对象可以 ...

  5. PTA(Advanced Level)1067.Sort with Swap(0, i)

    Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy to sort them in increasing order ...

  6. Vue代码分割懒加载的实现方法

    什么是懒加载 懒加载也叫延迟加载,即在需要的时候进行加载,随用随载. 为什么需要懒加载 在单页应用中,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多 ...

  7. storm group 的介绍与使用

    一.stream group分组介绍 Stream 的分组分为随机分组.字段分组.全部分组.全局分组.无分组.直接分组,自定义分组 二.group的介绍 1.Shuffle grouping:通过tu ...

  8. PHP搭建B2C分销商城系统需要考虑哪些因素?(一)

    在网购日渐繁盛的今天,传统线下门店和代理分销越发显示出其弊端.此种情况下,进入互联网市场是最好的选择.入驻第三方平台成本太高,无法掌握自己的流量,所以搭建自己的分销平台成为众多企业的首选.搭建B2C分 ...

  9. django中的缓存 跨域问题(同源策略)

    django缓存机制 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作 ...

  10. Codeforces 1097D. Makoto and a Blackboard

    传送门 首先考虑如果 $n$ 只有一个质因数的情况,即 $n=p^t$ 那么显然可以 $dp$ ,设 $f[i][j]$ 表示第 $i$ 步,当前剩下 $p^j$ 的概率 那么转移很简单: $f[i] ...