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\)是偶 ...
随机推荐
- mysqlslap 性能测试
--create-schema=name 指定测试的数据库名,默认是mysqlslap --engine=name 创建测试表所使用的存储引擎,可指定多个 --concurrency=N 模拟N个客户 ...
- 关于SVM的一些知识点
SVM支持向量机 定义:支持向量机是主要用于解决分类问题的学习模型.它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器. 分类 1-当训练样本线性可分,通过硬间隔最大化,学习一个线性分类 ...
- 什么是sigmoid激活函数?
上面我们讲了引入激活函数的意义,激活函数有多种,下面我们拿一种激活函数sigmoid来做示例,其他的类似.sigmoid函数表达式如下: 它的函数曲线图是: 看到上面的函数曲线图,可以看出是一 ...
- Coloring Edges 【拓扑判环】
题目链接:https://vjudge.net/contest/330119#problem/A 题目大意: 1.给出一张有向图,给该图涂色,要求同一个环里的边不可以全部都为同一种颜色.问最少需要多少 ...
- 模型预测控制 MPC
使用MPC的原因:
- 使用Google提供的ZXing Core,Java生成、解析二维码
1.maven项目中,pom.xml中引入ZXing Core工具包: <!-- https://mvnrepository.com/artifact/com.google.zxing/core ...
- 缓存穿透 & 缓存雪崩 & 缓存击穿
一 缓存穿透 1. 行为 查询一个一定不存在的数据.存储层(姑且认为是db,下面都用db指代)查不到数据则不写入缓存,那么下次请求这个不存在的数据同样会到db层查询,失去了缓存的意义.流量大或人为恶意 ...
- Kubernetes---Service(SVC)服务
⒈介绍 kubernetes 通过标签选择的方式来匹配一组pod,然后提供对外访问的一种机制 一组pod可以对应到多个svc的 每一个service(svc)都可以理解为一个微服务 Service有且 ...
- Linux系列(15)之进程管理
详细情况查看:https://www.cnblogs.com/dengyungao/p/8523628.html 1.查看进程 有两个命令可以查看进程,分别是ps与top(推荐使用),那他们有什么区别 ...
- 解决python无法安装mysql数据库问题
解决python无法安装mysql数据库问题: pip install pymysql[使用这个命令来安装]