题目链接:

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. python入门pk小游戏

    import time import random flag = True while flag: player_win = 0 enemy_win = 0 for i in range(1, 4): ...

  2. Linux Centos7 离线安装docker 【官网翻译和注释】

    Centos7的Docker安装 需要一个维护版本的centos7,所以6不行. 卸载旧版本 旧版本的docker被称为 docker or docker-engine 如果存在请删除它们. sudo ...

  3. finally代码块的执行

    try{ //todo }catch(Exception e){ //todo }finally{ //todo } 1.不管try,catch里面的代码快有无return,finally都会执行 2 ...

  4. ORACLE触发器的自治事务的注意事项

    直接上代码: Create OR replace Trigger TR_ROBXMX_CLDJBHHX After INSERT OR UPDATE OR DELETE ON ROBXMX1 --要监 ...

  5. ADO.NET连接数据库增删查改创建公用类

    顺序如下:再web.config中添加数据库的用户名和密码 创建公用类. //添加进web.config中的账号和密码 /*<connectionStrings> <add name ...

  6. LeetCode 腾讯精选50题--二叉树的最大深度

    求二叉树的最大深度, 基本思路如下: 设定一个全局变量记录二叉树的深度,利用递归,没遍历一层都将临时深度变量+1,并在每一节点递归结束后判断深度大小. 具体代码如下: package algorith ...

  7. Graphics与Canvas

    Graphics: 1. java.awt.Graphics;2.android.graphics Canvas:1.java.awt.Canvas;2.android.graphics.Canvas ...

  8. django 函数和类实现分页案例

    方法一: 模拟分页from django.shortcuts import render,HttpResponse from app01 import models def hostnames(req ...

  9. HashMap闭环(死循环)的详细原因(转)

    为何出现死循环简要说明 HashMap是非线程安全的,在并发场景中如果不保持足够的同步,就有可能在执行HashMap.get时进入死循环,将CPU的消耗到100%. HashMap采用链表解决Hash ...

  10. 远程操控批量复制应用(scp/pssh/pscp.pssh/rsync/pslurp)

    scp命令: scp [options] SRC... DEST/两种方式: scp [options] [user@]host:/sourcefile /destpath scp [options] ...