跳表上线性dp——1150D 好题!
题目设计的很好,感觉做了这题对dp的状态有了更深的理解
/*
先预处理序列自动机
dp[i][j][k]表示匹配到i,j,k时的最靠前的位置
那么现在A串加入了一个字母,我们要求的就是dp[i+1][j][k]
根据dp的状态转移
因为 dp[i][j][k]之前的状态已经全部确定下来,
所以只要在i+1的状态下枚举两重循环jk即可
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
char s[maxn];
int n,pos[],q,nxt[maxn][];
void init(){
for(int i=;i<;i++)pos[i]=n+;
for(int i=n;i>=;i--){
for(int j=;j<;j++)
nxt[i][j]=pos[j];
pos[s[i]-'a']=i;
}
for(int i=;i<;i++)
nxt[n+][i]=n+;
} int A,B,C,dp[][][];
char a[maxn],b[maxn],c[maxn];
int main(){
scanf("%d%d%s",&n,&q,s+);
init();
char op[],ch[];int p;
while(q--){
cin>>op>>p;
if(op[]=='-'){
if(p==)A--;if(p==)B--;if(p==)C--;
}
else {
cin>>ch;
if(p==){//带A的所有新状态
a[++A]=ch[];
for(int j=;j<=B;j++)
for(int k=;k<=C;k++)
dp[A][j][k]=n+;
for(int j=;j<=B;j++)
for(int k=;k<=C;k++){
dp[A][j][k]=min(dp[A][j][k],nxt[dp[A-][j][k]][a[A]-'a']);
if(j)dp[A][j][k]=min(dp[A][j][k],nxt[dp[A][j-][k]][b[j]-'a']);
if(k)dp[A][j][k]=min(dp[A][j][k],nxt[dp[A][j][k-]][c[k]-'a']);
//cout<<dp[A][j][k]<<'\n';
}
} if(p==){
b[++B]=ch[];
for(int i=;i<=A;i++)
for(int k=;k<=C;k++)
dp[i][B][k]=n+;
for(int i=;i<=A;i++)
for(int k=;k<=C;k++){
dp[i][B][k]=min(dp[i][B][k],nxt[dp[i][B-][k]][b[B]-'a']);
if(i)dp[i][B][k]=min(dp[i][B][k],nxt[dp[i-][B][k]][a[i]-'a']);
if(k)dp[i][B][k]=min(dp[i][B][k],nxt[dp[i][B][k-]][c[k]-'a']);
}
} if(p==){
c[++C]=ch[];
for(int i=;i<=A;i++)
for(int j=;j<=B;j++)
dp[i][j][C]=n+;
for(int i=;i<=A;i++)
for(int j=;j<=B;j++){
dp[i][j][C]=min(dp[i][j][C],nxt[dp[i][j][C-]][c[C]-'a']);
if(i)dp[i][j][C]=min(dp[i][j][C],nxt[dp[i-][j][C]][a[i]-'a']);
if(j)dp[i][j][C]=min(dp[i][j][C],nxt[dp[i][j-][C]][b[j]-'a']);
}
}
}
// cout<<dp[A][B][C]<<'\n';
if(dp[A][B][C]!=n+)puts("YES");
else puts("NO");
}
}
跳表上线性dp——1150D 好题!的更多相关文章
- 线性dp——cf1012C好题
比较套路的dp题 /* dp[i][j][0|1]:前i座山盖了j座房子,第i座不盖|盖 dp[i][j][0]=min( dp[i-1][j][0] , dp[i-1][j][1]+max(0,a[ ...
- zoj4027 线性dp!好题
非常好的dp,可是我太菜做不出来.. /* 第i个左括号不可能越过第i+1个左括号 如果第i个左括号到位置j,前提是第i+1个左括号就必须到位置j+1即以后 用dp[i][j]表示把第i个左括号转移到 ...
- 单调队列+线性dp题Watching Fireworks is Fun (CF372C)
一.Watching Fireworks is Fun(紫题) 题目:一个城镇有n个区域,从左到右1编号为n,每个区域之间距离1个单位距离节日中有m个烟火要放,给定放的地点ai,时间ti当时你在x,那 ...
- [线性DP][codeforces-1110D.Jongmah]一道花里胡哨的DP题
题目来源: Codeforces - 1110D 题意:你有n张牌(1,2,3,...,m)你要尽可能多的打出[x,x+1,x+2] 或者[x,x,x]的牌型,问最多能打出多少种牌 思路: 1.三组[ ...
- lettcode 上的几道哈希表与链表组合的数据结构题
目录 LRU缓存 LFU缓存 全O(1)的数据结构 lettcode 上的几道哈希表与链表组合的数据结构题 下面这几道题都要求在O(1)时间内完成每种操作. LRU缓存 LRU是Least Recen ...
- cf909C 线性dp+滚动数组好题!
一开始一直以为是区间dp.. /* f下面必须有一个s 其余的s可以和任意f进行匹配 所以用线性dp来做 先预处理一下: fffssfsfs==>3 0 1 1 dp[i][j] 表示第i行缩进 ...
- Nowcoder Removal ( 字符串上的线性 DP )
题目链接 题意 : 给出长度为 n 的字符串.问你准确删除 m 个元素之后.能产生多少种不同的子串 分析 ( 参考博客 ): 可以考虑线性 DP 解决这个问题 试着如下定义动态规划数组 dp[i][ ...
- 线性dp
线性dp应该是dp中比较简单的一类,不过也有难的.(矩乘优化递推请出门右转) 线性dp一般是用前面的状态去推后面的,也有用后面往前面推的,这时候把循环顺序倒一倒就行了.如果有的题又要从前往后推又要从后 ...
- 机器分配----线性dp难题(对于我来说)
题目: 总公司拥有高效设备M台, 准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M <= 15, ...
随机推荐
- 1、linux常用命令的英文单词缩写
1.linux常用命令的英文单词缩写 命令缩写: ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户 rpm:redhat pa ...
- 将Mysq数据导入solr索引库
本文的基础环境都是在centos 64bit,jdk1.7.79 将mysql 的jar 包添加到/home/hadoop/cloudsolr/solr-4.10.4/contrib/dataimpo ...
- 记一次java简单的if语句使用多态重构
场景描述: 一个controller中,部门领导有布置任务,查看任务整体情况,查看部门成员,查看部门成员完成情况,导出任务详情,如下: @RestController @RequestMapping( ...
- Substring UVA - 11468 AC自动机+概率DP
题意: 给出一些字符和各自对应的选择概率,随机选择L次后得到一个长度为L的随机字符串S. 给出K个模板串,计算S不包含任何一个模板串的概率 dp[i][j]表示走到AC自动机 i 这个节点 还需要走 ...
- POST提交数据之---Content-Type的理解
Content-Type是指http/https发送信息至服务器时的内容编码类型,contentType用于表明发送数据流的类型,服务器根据编码类型使用特定的解析方式,获取数据流中的数据. 在网络请求 ...
- windows 10 无法启动 windows update 服务 错误 0x80070005 拒绝访问
windows 10 无法启动 windows update 服务 错误 0x80070005 拒绝访问: 解决方法: 首先重命名系统盘 windows目录下的代号为“SoftwareDistribu ...
- RabbitMQ学习第二记:工作队列的两种分发方式,轮询分发(Round-robin)和 公平分发(Fair dispatch)
1.什么是RabbitMQ工作队列 我们在应用程序使用消息系统时,一般情况下生产者往队列里插入数据时速度是比较快的,但是消费者消费数据往往涉及到一些业务逻辑处理导致速度跟不上生产者生产数据.因此如果一 ...
- zepto(mark)
Zepto的设计目的是提供 jQuery 的类似的API,但并不是100%覆盖 jQuery .Zepto设计的目的是有一个5-10k的通用库.下载并快速执行.有一个熟悉通用的API,所以你能把你主要 ...
- div中内容可左右上下滑动
在<table>外套一层<div>,并且声明overflow:scroll属性,如: <div style="width:1620px;height:680px ...
- Open CV 环境配置
{ //https://github.com/zhmmmm/ANYTOOL-2.0.0.0.2Version/tree/master/OpenCVProject } /* //各个版本下载 https ...