Codeforces 1149 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的更多相关文章
- CodeForces - 1150 D Three Religions
题目传送门 题解: id[ i ][ j ] 代表的是在第j个位置之后的第i个字符的位置在哪里. dp[ i ][ j ][ k ] 代表的是 第一个串匹配到第i个位置, 第二个串匹配到第j个位置, ...
- Codeforces Round #556 (Div. 2) - D. Three Religions(动态规划)
Problem Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 3000 mSec Problem Descripti ...
- Codeforces Round #556 (Div. 2) D. Three Religions 题解 动态规划
题目链接:http://codeforces.com/contest/1150/problem/D 题目大意: 你有一个参考串 s 和三个装载字符串的容器 vec[0..2] ,然后还有 q 次操作, ...
- codeforces#1150D. Three Religions(dp+序列自动机)
题目链接: https://codeforces.com/contest/1150/problem/D 题意: 给出长度为$n$的字符串,和$q$次询问 每次询问是,给$x$宗教增加一个字符$key$ ...
- Three Religions CodeForces - 1149B (字符串,dp)
大意: 给定字符串S, 要求维护三个串, 支持在每个串末尾添加或删除字符, 询问S是否能找到三个不相交的子序列等于三个串. 暴力DP, 若不考虑动态维护的话, 可以直接$O(len^3)$处理出最少需 ...
- Codeforces 1050D Three Religions (dp+序列自动机)
题意: 给一个1e5的串str,然后有三个起始空串,不超过1000次操作,对三个字符串的一个尾部加一个字符或者减一个字符,保证每个字符不会超过250 每次操作之后询问你这三个串是不是可以组成str的子 ...
- Codeforces Round #556 题解
Codeforces Round #556 题解 Div.2 A Stock Arbitraging 傻逼题 Div.2 B Tiling Challenge 傻逼题 Div.1 A Prefix S ...
- Codeforces Round #556 (Div. 2) - C. Prefix Sum Primes(思维)
Problem Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 1000 mSec Problem Descripti ...
- Codeforces Round #556 (Div. 1)
Codeforces Round #556 (Div. 1) A. Prefix Sum Primes 给你一堆1,2,你可以任意排序,要求你输出的数列的前缀和中质数个数最大. 发现只有\(2\)是偶 ...
随机推荐
- django 之(四) --- 级联|截流
登陆注册 登陆注册实现 settings.py # redis配置 CACHES = { "default": { "BACKEND": "djang ...
- 一个老程序员PHP程序员说的话(用来提醒自己)
我,一个老程序员,也是一个学生,把玩过甚多语言,大多不精.我既非名牌学校,也不是高学历,仅代表一部分比较蛋疼的人.接触PHP也是很早了,从04年的OFSTAR开始的,到现在六年了,期间也接触过不少的语 ...
- spring boot中Elasticsearch默认版本问题
这是今天遇上的一个问题. 添加的依赖是7.2.0版本的Elasticsearch,但是其中有两项是6.4.3的,导致我从其他地方移植过来的代码报错. 据大神说,这是因为spring boot中默认的E ...
- Vue中ESlint配置文件.eslintrc文件
很久没有分享和更新过了 今天就给大家分享一篇 Vue中ESlint配置文件.eslintrc文件详解吧 ------------------------------------------------ ...
- Jquery对表单、表格的操作以及应用
表单的应用 (1)表单标签:包含处理表单数据所用的服务器端程序URL以及数据提交到服务器的方法 (2)表单域:包含文本框.密码框.隐藏域.多行文本框.复选框.单选框.下拉选择框.和文件上传框 (3)表 ...
- 《Tsinghua os mooc》第1~4讲 启动、中断、异常和系统调用
资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 疑问 为什么用户态和内核态 ...
- [转帖]四个修改Docker默认存储位置的方法
四个修改Docker默认存储位置的方法 https://blog.51cto.com/forangela/1949947 易改乾坤关注0人评论27435人阅读2017-07-22 09:18:48 ...
- [转帖]centos7上设置中文字符集
centos7上设置中文字符集 https://www.cnblogs.com/kaishirenshi/p/10528034.html author: headsen chen date: 201 ...
- XSSFWorkbook对象 进行zip打包时 用write资源流自动关闭处理办法
XSSFWorkbook对象的write方法内会将传入的资源流自动关闭 导致下载excel失败 错误代码 OutputStream out = response.getOutputStream(); ...
- mysqldump原理及实战
使用mysqldump命令行工具创建逻辑备份: 注意mysqldump的版本和路径mysqldump命令创建的是逻辑备份,结果集有两种格式:一种是将数据转换成标准的SQL语句(一堆CREATE,DRO ...