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\)是偶 ...
随机推荐
- Grep---linux系统三剑客(一)
grep .sed.awk被称为linux中的"三剑客". grep 更适合单纯的查找或匹配文本 sed 更适合编辑匹配到的文本 awk 更适合格式化文本,对文本进行较复杂格式 ...
- vim实现批量注释和批量删除注释
批量注释 1.进入文档,vim test.txt 后,按住ctrl+v进入VISUAL BLOCK模式,上下选择需要注释的行 2.按大写键,再按i,或者直接按shift+i,进入INSERT模式,输入 ...
- PHP根据IP判断地区名信息的示例代码
<?php header("Content-type: text/html; charset=utf-8"); function getIP(){ if (isset($_S ...
- Java学习笔记-Lambda表达式
Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数是接口)的实例 意义 自从Java 8开始,Java支持Lambda表达 ...
- 浪潮服务器NF84260M3安装Windows server 2012 R2 RAID配置
这里是已经做了RAID6,再做系统 浪潮服务器NF84260M3 U盘启动,光盘刻录 Windows server 2012 R2 镜像,地址:迅雷下载,ed2k://|file|cn_windows ...
- Oracle数据库连接工具的使用(二)
一.SQL Plus介绍 1.简介 Oracle的sql plus是与oracle进行交互的客户端工具.在sql plus中,可以运行sql plus命令与sql语句. 我们通常所说的DML.DDL. ...
- base64转码java版
package com.net.util; import java.io.FileInputStream; import java.io.FileOutputStream; import java.i ...
- Linux系列(14)之工作管理
1.工作管理 说明:工作管理(job control)是用在bash环境下的,也就是说:“当我们登录系统取得bash shell之后,在单一终端机接口下同时进行多个工作的行为管理”.举例说明,我们在登 ...
- 2.4容错保护:Hystrix
在ribbon使用断路器 改造serice-ribbon 工程的代码,首先在pox.xml文件中加入spring-cloud-starter-hystrix的起步依赖: 引入 <dependen ...
- DEDE调用列表页,前台titlelen显示不全问题解决
一. 问题描述:{dede:list titlelen='100'}标题长度设为100后,但前台调用显示最长却只有60. 二. 产生原因:经过我多度查找,最终导致标题显示不全的原因是在DEDE生数据库 ...