题目链接:

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. CORE EF生成ORACLE数据库模型报错问题记录

    需求:最近在新开发一套在LINUX运行的API接口,需要用到net core api框架以及oracle数据库,首先需要解决的就是连接数据库问题,由于是DBFirst 加上之前很多老表不规范,导致了c ...

  2. net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了   原文链接:https://www.cnblogs.com/yilezhu/p/9985451.ht ...

  3. loj 2292「THUSC 2016」成绩单

    loj 看着就很区间dp,所以考虑求\(f_{i,j}\)表示区间\([i,j]\)的答案.注意到贡献答案的方式是每次选一个连续段,拿走后剩下的段拼起来继续段,所以转移就考虑从最后一次选的方法转移过来 ...

  4. oc和swift对代码的分组,方便代码查找和导航用

    OC中对代码的分组: 在OC中对代码分组的命令是#pragma mark 来实现的, 分组用的是: #pragma mark 分组名 添加分割线: #pragma mark - 如果想添加分割线的同时 ...

  5. ASP.NET如何接收清楚缓存的通知

    1 如果使用cache的add方法或者接受CacheItemPriority值得Insert方法重载接收通知,可以提供CacheItemRemovedCallBack对象,选择在清除对象时接收通知 u ...

  6. 转载:PHP扩展函数库-文件系统、进程与网络

    PHP的扩展函数库十分庞大,官方的非官方的,在这里只记录一些目前比较常用的扩展,对于这一部分,也只是记录其中一些核心的函数,不是一个全面记录.对于详细的扩展函数说明,需要在使用中参考PHP的用户手册. ...

  7. # 机器学习算法总结-第六天(Adaboost算法)

    SKlearn中的Adaboost使用 主要调的参数:第一部分是对我们的Adaboost的框架进行调参, 第二部分是对我们选择的弱分类器进行调参. 使用 Adaboost 进行手写数字识别 导入库,载 ...

  8. 【loj#6220】sum

    题目传送门:https://loj.ac/problem/6220 题意:对于一个序列$a$,找出它的一个子序列$b$,使$\sum_{a_i \in b}a_i \equiv 0 \pmod n$ ...

  9. Centos安装MySQL5.6并重置密码

    数据库配置 如果用的是自带的sqllite那么数据库就可以不动 安装MySQL5.6数据库 这里强烈建议用使用5.6, 5.7版本的数据库遇见了很多BUG 安装MySQL wget http://de ...

  10. 在idea中相同的字符串使用equals()进行比较时,返回值是flase问题

    最近在idea中遇到了一个编码的问题,我的程序是从前台传过来一个字符串,判断用户的角色(学生,教师,管理员), 在进行equals()判断时,返回的确是false,然后就在网上查了查,发现是编码的问题 ...