题目链接:

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. 牛客 133D 挑选队友 (分治FFT)

    大意: $n$个人, 分别属于$m$个组, 要求选出$k$个人, 使得每组至少有一人, 求方案数. 显然答案为$\prod((1+x)^{a_i}-1)$的第$k$项系数, 分治$FFT$即可. #i ...

  2. c#学习笔记-string stringBuilder

    string aTest = "abc";//分配固定的内存大小 aTest += "ddd"; //销毁原先的数据再来分配,消耗大 StringBuilder ...

  3. nginx触屏版跟PC的代理设置

    server { listen ; set $mobile_rewrite do_not_perform; if ( $http_user_agent ~* "(android|bb\d+| ...

  4. Unsupported major.minor version 52.0错误和 jdbc odbc

    什么是JDBC? JDBC, 全称为Java DataBase Connectivity standard, 它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库.JDBC也是jav ...

  5. Viola–Jones object detection framework--Rapid Object Detection using a Boosted Cascade of Simple Features中文翻译 及 matlab实现(见文末链接)

    ACCEPTED CONFERENCE ON COMPUTER VISION AND PATTERN RECOGNITION 2001 Rapid Object Detection using a B ...

  6. Javascript中的继承与复用

    实现代码复用的方法包括:工厂模式.构造函数模式.原型模式(<高三>6.2章 P144),它们各自的特点归结如下:1.工厂模式虽然使创建对象一定程度上实现了代码复用,但却没有解决对象识别问题 ...

  7. [JZOJ4307]喝喝喝--枚举

    [JZOJ4307]喝喝喝--枚举 题目链接 自行搜索 分析 我们需要找到所有不包含\((a_x,a_y),a_x \equiv k \mod a_y (x<y)\)这样的连续数对,转化一下变成 ...

  8. Java Web-JSP学习

    Java Web-JSP学习 概念 Java Server Pages:Java服务器端页面.可以在其中直接定义HTML标签,也可以在其中直接定义java代码. 关于JSP和JAVASCRIPT的区别 ...

  9. C#/.net 通过js调用系统相机进行拍照,图片无损压缩后进行二维码识别

    这两天撸了一个需求,通过 JS  调用手机后置相机,进行拍照扫码.前台实现调用手机相机,然后截取图片并上传到后台的功能.后台接收传过来的图片后,通过调用开源二维码识别库 ZXing 进行二维码数据解析 ...

  10. linux 操作系统安装

    操作系统安装 安装虚拟机软件:一路Next即可 VMWare:如果14版本不支持你的CPU,就换成12版本 Virtual Box:比VMWare小很多 安装ubuntu操作系统:比较美观,实用性强 ...