跳表上线性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, ...
随机推荐
- 去掉Word 标题编号变成黑框
问题: 在使用Word编写文档时,提前拟好的标题编号会突然变成黑框(黑色的方框,黑色的矩形),如下图 解决方案: 1.将光标定位到标题中,紧邻黑框的右侧 2.按键盘左方向键使方框变成黑色 3.按键盘的 ...
- python爬取文件时,内容为空
解决方式: img_res = requests.get(src,headers=header)在header中加上referer防盗链加上防盗链header的例子: header = {" ...
- sacnf遇到空格与回车问题
看scanf输入的是多个字符还是一个字符.如果是多个字符,遇空格和回车都不会结束输入:如果是一个字符,遇空格不会结束,遇回车结束输入.如:①#include<stdio.h> ...
- 2- SQL语句的强化
查询类型cate_name为 '超极本' 的商品名称.价格 select name,price from goods where cate_name = '超级本'; 显示商品的种类 select c ...
- 用PS制作APP的界面图片
今天就教大家怎么做出这种厚度的地方还不是白色的,而是根据界面内容交相呼应的图案的APP界面展示图片. 以苹果5S的尺寸为例. 步骤: 1.新建一个画布尺寸为:640*1136,然后保存,命名如:5S效 ...
- Leetcode241.Different Ways to Add Parentheses为运算表达式设计优先级
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含 +, - 以及 * . 示例 1: 输入: "2-1 ...
- 利用DNSQuery 进行DNS查询
#include <WinSock2.h> #include <WinDNS.h> #pragma comment (lib, "Dnsapi.lib") ...
- JS的十大经典算法
冒泡排序(Bubble Sort) 冒泡排序须知: 作为最简单的排序算法之一,冒泡排序给我的感觉就像Abandon在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉...冒泡排序还有一种优化算 ...
- Centos 6.5 python版本升级到2.7.8
Centos6.5默认的 python版本是2.6 为了使用aliyuncli工具,直接用pip安装aliyuncli提示错误. 所以决定升级下python版本,但是yum依赖于python2.6,升 ...
- Visual Studio 2010 error C2065: '_In_opt_z_' : undeclared identifier 编译错误
当用Visual Studio 2010 编译时 发生如下编译错误: 2>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\inclu ...