题意:给你一个长度为n的字符串,有q次询问,每次询问会给字符串x的末尾添加一个字符y,或者删除字符串x末尾的字符,询问过后,要判断长度为n的字符串中是否有3个不重合的子序列,是这3个字符串。

思路:设dp[i][j][j]为3个字符串的长度分别为i, j, k时,匹配的最靠前的位置。那么就枚举是通过哪个字符串转移即可,但是这样是O(n ^ 3)的。我们注意到每次询问过后某个字符串的长度最多改变1,那么我们可以只重新计算没改变的那两维就可以了。

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int Next[maxn][26], dp[255][255][255], now[26];
int a[4][300], tot[4];
char s[maxn];
int main() {
int n, m, x;
char op[5];
scanf("%d%d", &n, &m);
scanf("%s",s + 1);
for (int i = 0; i < 26; i++) {
now[i] = n + 1;
Next[n + 1][i] = n + 1;
}
for (int i = n; i >= 1; i--) {
for (int j = 0; j < 26; j++) {
Next[i][j] = now[j];
}
now[s[i] - 'a'] = i;
}
for (int i = 0; i < 26; i++)
Next[0][i] = now[i];
while(m--) {
scanf("%s", op + 1);
if(op[1] == '+') {
scanf("%d", &x);
scanf("%s", op + 1);
int y = op[1] - 'a';
a[x][++tot[x]] = y;
for (int i = (x == 1 ? tot[1] : 0); i <= tot[1]; i++)
for (int j = (x == 2 ? tot[2] : 0); j <= tot[2]; j++)
for (int k = (x == 3 ? tot[3] : 0); k <= tot[3]; k++) {
dp[i][j][k] = n + 1;
}
for (int i = (x == 1 ? tot[1] : 0); i <= tot[1]; i++)
for (int j = (x == 2 ? tot[2] : 0); j <= tot[2]; j++)
for (int k = (x == 3 ? tot[3] : 0); k <= tot[3]; k++) {
if(i) dp[i][j][k] = min(dp[i][j][k], Next[dp[i - 1][j][k]][a[1][i]]);
if(j) dp[i][j][k] = min(dp[i][j][k], Next[dp[i][j - 1][k]][a[2][j]]);
if(k) dp[i][j][k] = min(dp[i][j][k], Next[dp[i][j][k - 1]][a[3][k]]);
}
} else {
scanf("%d", &x);
tot[x]--;
}
if(dp[tot[1]][tot[2]][tot[3]] <= n) printf("YES\n");
else printf("NO\n");
}
}

  

Codeforces 1150D DP的更多相关文章

  1. codeforces#1150D. Three Religions(dp+序列自动机)

    题目链接: https://codeforces.com/contest/1150/problem/D 题意: 给出长度为$n$的字符串,和$q$次询问 每次询问是,给$x$宗教增加一个字符$key$ ...

  2. Codeforces 1150D(字符串dp)

    反思 三维的dp压根没看出来,看题解以后思路又很直观,找几道字符串dp练练才行 序列自动机和优化一维略 /* __ __ * ____| |_____| |____ * | | * | __ | * ...

  3. Two Melodies CodeForces - 813D (DP,技巧)

    https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #in ...

  4. Consecutive Subsequence CodeForces - 977F(dp)

    Consecutive Subsequence CodeForces - 977F 题目大意:输出一序列中的最大的连续数列的长度和与其对应的下标(连续是指 7 8 9这样的数列) 解题思路: 状态:把 ...

  5. codeforces的dp专题

    1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...

  6. Codeforces 721C [dp][拓扑排序]

    /* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG), ...

  7. CodeForces 607C (DP) Hard problem

    题目:这里 题意:给定n个字符串,每个字符串可以进行一项操作,就是将这个字符串交换,就是该字符串的第一个和最后一个交换,第二个和倒数第二个交换,以此类推,当然可以选择对于 该字符串进行或不进行这项操作 ...

  8. Codeforces 611d [DP][字符串]

    /* 题意:给一个长度不超过5000的字符串,每个字符都是0到9的数字. 要求将整个字符串划分成严格递增的几个数字,并且不允许前导零. 思路: 1.很开心得发现,当我在前i个区间以后再加一个区间的时候 ...

  9. Codeforces 404D [DP]

    /* 我是一个习惯后悔,但是没办法忍受内疚感的二货== 这题是个无脑dp,但是比赛大概20min没出...其实最后5min我好好想想简单化边界条件,可以出的. 题意: 给你一个长度为1e6的由?*01 ...

随机推荐

  1. html中插入css的4种方法

    #1:链入外部样式表 <head> <link href="mystyle.css" rel="stylesheet" type=" ...

  2. 多个ip地址获取

    #include "stdafx.h"#include <stdio.h> #include <winsock.h> #include <window ...

  3. Git--将已有的项目添加到github(转)

    转自:https://blog.csdn.net/north1989/article/details/53471439 1. 目标: 把本地已经存在的项目,推送到github服务端,实现共享. 2. ...

  4. shell巡检草拟

    #!/bin/bash phy_cpu=$(cat /proc/cpuinfo | grep "physical id"|sort | uniq | wc -l) logic_cp ...

  5. 1.MVC的初步了解

    1.MVC简单介绍 1)原理(如图)如果想更加深入了解原理,可以访问此地址(https://www.cnblogs.com/uicodeintoworld/p/8950877.html) 理解:客户端 ...

  6. 如何给 List 集合排序

    一,List<Integer>的排序示例代码:List<Integer> list = new ArrayList<Integer>();list.add(6);l ...

  7. range类型(Python)

    range 不是 iterator >>> R = range(3) >>> next(R) Traceback (most recent call last): ...

  8. js 中数组传递到后台controller 批量删除

    /*批量删除*/function datadel(url) { var ids=[]; $("input[type='checkbox']:checked").each(funct ...

  9. Sqli labs系列-less-5&6 报错注入法(上)

    在我一系列常规的测试后发现,第五关和第六关,是属于报错注入的关卡,两关的区别是一个是单引号一个是双引号...当然我是看了源码的.... 基于报错注入的方法,我早就忘的差不多了,,,我记的我最后一次基于 ...

  10. 搞懂分布式技术14:Spring Boot使用注解集成Redis缓存

    本文内容参考网络,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutor ...