题目链接:

https://codeforces.com/contest/1150/problem/D

题意:

给出长度为$n$的字符串,和$q$次询问

每次询问是,给$x$宗教增加一个字符$key$,或者让$x$宗教的字符串长度减一

问是否给原字符串染色,每个字符只能染上一种颜色,把相同颜色字符串按顺序取出刚好是每个宗教的字符串

数据范围:

$1 \leq n \leq 100\,000$
$1 \leq q \leq 1000$

分析:

定义状态$DP[x][y][z]$,为考虑1号宗教字符串长度$x$,考虑2号宗教字符串长度$y$,考虑3号宗教字符串长度$z$,给它们匹配需要的最短原字符串

$DP[x][y][z]=min(nex[DP[x-1][y][z]+1]],nex[DP[x][y-1][z]+1]],nex[DP[x][y][z-1]+1]])$

具体看代码

ac代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int maxm=250+10;
int len[maxm][4],top[4];
int word[maxn],nex[maxn][30];
int dp[maxm][maxm][maxm];
int main()
{
int n,q;
scanf("%d %d",&n,&q);
getchar();
for(int i=1;i<=n;i++)
{
char key;
scanf("%c",&key);
word[i]=key-'a';
}
for(int i=0;i<30;i++)
nex[n+1][i]=nex[n+2][i]=n+1;
for(int i=n;i>=1;i--)
{
for(int j=0;j<30;j++)
nex[i][j]=nex[i+1][j];
nex[i][word[i]]=i;
}
for(int i=0;i<30;i++)nex[0][i]=nex[1][i];
while(q--)
{
getchar();
char comd;
scanf("%c",&comd);
if(comd=='+')
{
char key;
int t,x;
scanf("%d %c",&t,&key);
x=key-'a';
len[++top[t]][t]=x;
for(int i=(t==1?top[1]:0);i<=top[1];i++)
for(int j=(t==2?top[2]:0);j<=top[2];j++)
for(int k=(t==3?top[3]:0);k<=top[3];k++)
dp[i][j][k]=n+1;
dp[0][0][0]=0;
for(int i=(t==1?top[1]:0);i<=top[1];i++)
for(int j=(t==2?top[2]:0);j<=top[2];j++)
for(int k=(t==3?top[3]:0);k<=top[3];k++)
{
// cout<<i<<" "<<j<<" "<<k<<endl;
// cout<<dp[i][j][k]<<endl;
if(i!=0)
dp[i][j][k]=min(dp[i][j][k],nex[dp[i-1][j][k]+1][len[i][1]]);
if(j!=0)
dp[i][j][k]=min(dp[i][j][k],nex[dp[i][j-1][k]+1][len[j][2]]);
if(k!=0)
dp[i][j][k]=min(dp[i][j][k],nex[dp[i][j][k-1]+1][len[k][3]]);
}
}
else
{
int t;
scanf("%d",&t);
top[t]--;
}
// cout<<dp[top[1]][top[2]][top[3]]<<endl;
if(dp[top[1]][top[2]][top[3]]<=n)printf("YES\n");
else printf("NO\n");
} return 0;
}

  

codeforces#1150D. Three Religions(dp+序列自动机)的更多相关文章

  1. Codeforces 1050D Three Religions (dp+序列自动机)

    题意: 给一个1e5的串str,然后有三个起始空串,不超过1000次操作,对三个字符串的一个尾部加一个字符或者减一个字符,保证每个字符不会超过250 每次操作之后询问你这三个串是不是可以组成str的子 ...

  2. PTA L3-020 至多删三个字符 (序列dp/序列自动机)

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 1] 内的字符串. 输 ...

  3. Codeforces 1150D(字符串dp)

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

  4. CF 1150 D Three Religions——序列自动机优化DP

    题目:http://codeforces.com/contest/1150/problem/D 老是想着枚举当前在给定字符串的哪个位置,以此来转移. 所以想对三个串分别建 trie 树,然后求出三个t ...

  5. 洛谷P4608 [FJOI2016]所有公共子序列问题 【序列自动机 + dp + 高精】

    题目链接 洛谷P4608 题解 建个序列自动机后 第一问暴搜 第二问dp + 高精 设\(f[i][j]\)为两个序列自动机分别走到\(i\)和\(j\)节点的方案数,答案就是\(f[0][0]\) ...

  6. BZOJ4032 [HEOI2015]最短不公共子串 【后缀自动机 + 序列自动机 + dp】

    题目链接 BZOJ4032 题解 首先膜\(hb\) 空手切神题 一问\(hash\),二问枚举 三问\(trie\)树,四问\(dp\) 南二巨佬神\(hb\) 空手吊打自动机 \(orz orz ...

  7. BZOJ4032[HEOI2015]最短不公共子串——序列自动机+后缀自动机+DP+贪心

    题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...

  8. BZOJ4416 [Shoi2013]阶乘字符串 【序列自动机 + 状压dp】

    题目链接 BZOJ4416 题解 建立序列自动机,即预处理数组\(nxt[i][j]\)表示\(i\)位置之后下一个\(j\)出现的位置 设\(f[i]\)表示合法字符集合为\(i\)的最短前缀,枚举 ...

  9. 后缀自动机&序列自动机综合

    好像序列自动机还没有写过- 串长为n的串共有n+1个节点,除了串中的n个节点,还有一个空的根节点放在串首.每个节点至多有26条出边,每条边连向它之后的第一个字符. 串中的任意一个子序列对应了一条根到某 ...

随机推荐

  1. Java 私有构造函数的使用

    被private修饰的私有构造函数无法在其他类中调用,也就是该类无法在其他类中实例化. 这种情况常用的使用场景:1.单例模式: 2.防止实例化. 一.单例模式 单例模式是一种常用的设计模式,思想是单例 ...

  2. 前端工程师应该知道的yarn知识

    yarn 是在工作中离不开的工具,但在工作中,很多人基本只会使用 yarn install,而且会手动删除 node-modules,或删除 yarn.lock 文件等不规范操作.本文将从一些基础的知 ...

  3. MongoDB的复合唯一索引

    一 创建 JavaScript Shell db.room.ensureIndex({'floor':1,'num':1}) Spring Data @Data // lombok @Document ...

  4. Apache开启.htaccess 支持

    (1) <Directory "${SRVROOT}/htdocs"> # # Possible values for the Options directive ar ...

  5. SSE指令集加速之 I420转BGR24

    void yuv420_to_rgb24_sse3(uint8_t *yp, uint8_t *up, uint8_t *vp, int sy, int suv, int width, int hei ...

  6. Outline 科学的上网

    outline 官网:https://getoutline.org/zh-CN/home 下载 Outline 管理器 下载 Outline 客户端 配置浏览器代理

  7. iTop4412开发板+虚拟机+tftp服务

    感觉好坑啊 利用路由器+2根网线+tftp服务 首先是开发板,主机,虚拟机相互之间能ping通(坑), 关闭主机防火墙,防止被强 关闭虚拟机防火墙 虚拟机装上tftpd服务端(通过网上教程嘛) 是不是 ...

  8. Linux内核移植主要过程

  9. 数据结构课后练习题(练习三)7-5 Tree Traversals Again (25 分)

    7-5 Tree Traversals Again (25 分)   An inorder binary tree traversal can be implemented in a non-recu ...

  10. python+Appium自动化:元素等待时间

    元素等待时间 为什么要设置等待时间呢?主要是因为界面加载时,为了防止元素还未出现影响后续的操作. 主要有三种方式:强制(线性)等待.隐式等待.显式等待 适用于appium和selenium 强制(线性 ...