CF1149B Three Religions

CF1149B Three Religions

题意:

给定长度为 n 的母串和三个子串s1,s2,s3s_1,s_2,s_3s1,s2,s3 。初始时子串均为空。有 q 次询问。你需要支持两种操作:向某个子串末尾添加一个字母,或者删去某个子串末尾的字母。在每次操作后,你需要回答,是否能从母串中分离出三个不相交的子序列(不改变字符原有顺序),满足这三个子序列恰好是s1,s2,s3s_1,s_2,s_3s1,s2,s3
在任意时刻,s1,s2,s3s_1,s_2,s_3s1,s2,s3的长度均不会超过 250

1≤n≤105,1≤q≤1031 \le n \le 10^5, 1\le q \le 10^31n105,1q103

题解:

想了半天,想不到真的想不到啊
dp题
设f[i][j][k]:表示匹配了A串的前i个字符(第i个字符选择了原串中x位置),B串匹配了前j个字符(第j个字符选择原串中y位置),C串匹配了前k个字符时(选择原串中z位置),至少需要到模式串的位置(max(x,y,z))
数组s[i][0/1/2]:分别表示三个子串s1,s2,s3
我们需要一个nxt[i][c]来辅助转移:表示在原串中[i,n]区间内,'c’字符第一次出现的位置
对着图,nxt数组的含义很好理解。cf官方题解的图
在这里插入图片描述
现在我们开始考虑转移:
当f[][][]>n时就说明匹配失败
初始化f[i][j][k]=n+1,f[0][0][0]=0
转移方程:
f[i][j][k]=min{nxt[f[i−1][j][k]+1][s[1][i]],nxt[f[i][j−1][k]+1][s[2][j]],nxt[f[i][j][k−1]+1][s[3][k]]}f[i][j][k]=min\{nxt[f[i-1][j][k]+1][s[1][i]],nxt[f[i][j-1][k]+1][s[2][j]],nxt[f[i][j][k-1]+1][s[3][k]]\}f[i][j][k]=min{nxt[f[i1][j][k]+1][s[1][i]],nxt[f[i][j1][k]+1][s[2][j]]nxt[f[i][j][k1]+1][s[3][k]]}
其实含义很简单:我们就试图从A串中加个字符找后续位置,从B串中价格字符找后续位置,从C串中价格字符找后续位置,从这个三个位置中选取最佳(即最左边)转移
对于每次插入我们只会在一个子串末端加,另外两个不变,那么新增状态只有新加字符与另外两个不变的串的位置关系,这样有1∗250∗2501*250*2501250250种状态,对于这些新状态重新跑就可以,不用全部都重新跑
对于删除操作,直接减小对应串长。因为我们之前转移时小的状态都算好了,所以直接减对应的串长就可以得到新的答案
答案就是ans[f[len1][len2][len3]]ans[f[len1][len2][len3]]ans[f[len1][len2][len3]],表示三个串全部匹配完之后,在模式串中的最左点。对于样例来说,就是如图三个位置取最大值。如果<=n,说明有解,如果>n,说明无解
在这里插入图片描述

代码:

#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...);
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#elsestartTime = clock ();freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn=2e5+9;
int s[4][300];
int nxt[maxn][30];
int f[300][300][300];
int len[4];
int n,q;
char str[maxn];
void init(){for(int i=0;i<26;i++)nxt[n+1][i]=nxt[n+2][i]=n+1;for(int i=n;i;i--){for(int j=0;j<26;j++){if(str[i]==j+'a')nxt[i][j]=i;else nxt[i][j]=nxt[i+1][j];}}
}
void solve(){char ch;cin>>ch;int id;read(id);if(ch=='+'){cin>>ch;s[id][++len[id]]=ch-'a';for(int i=(id==1?len[1]:0);i<=len[1];i++){for(int j=(id==2?len[2]:0);j<=len[2];j++){for(int k=(id==3?len[3]:0);k<=len[3];k++){int now=n+1;if(i)now=min(now,nxt[f[i-1][j][k]+1][s[1][i]]);if(j)now=min(now,nxt[f[i][j-1][k]+1][s[2][j]]);if(k)now=min(now,nxt[f[i][j][k-1]+1][s[3][k]]);f[i][j][k]=now;}}}}else if(ch=='-'){len[id]--;}cout<<"f[][][]="<<f[len[1]][len[2]][len[3]]<<endl;if(f[len[1]][len[2]][len[3]]<=n)puts("YES");else puts("NO");
}
int main()
{//rd_test();read(n,q);scanf("%s",str+1);init();while(q--)solve();return 0;//Time_test();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【译文】领域模型的五个特征

我在这篇博客文章中&#xff0c;我试图给领域模型下一个非常合适的定义&#xff0c;我发现我的这些定义都不太妥当&#xff0c;不过&#xff0c;我们还是可以先来看一下wiki百科对领域驱动模型下的定义&#xff1a;问题解决和软件工程中的领域模型可以被认为是感兴趣的领域&…

使用ASP.NET Core 实现Docker的HealthCheck指令

写在前面HealthCheck 不仅是对应用程序内运行情况、数据流通情况进行检查&#xff0c; 还包括应用程序对外部服务或依赖资源的健康检查。健康检查通常是以暴露应用程序的HTTP端点的形式 实施&#xff0c;可用于配置健康探测的的场景有 &#xff1a;容器或负载均衡器 探测应用状…

VS Code 中有哪些好用的 Azure 插件?

在之前的文章中&#xff0c;我们提到了 Amazon、Google、IBM、Red Hat、Salesforce、Pivotal 等大厂都在 VS Code 中有提供相应的开发工具&#xff1a;亚马逊上了 VS Code 的船&#xff0c;还有哪些大厂也上了船&#xff1f;微软必定更是把 VS Code 作为其最重要的开发者平台了…

邀请 | 关于微软容器服务,你需要知道的二三事

容器是近年来特别火的话题&#xff0c;那么&#xff0c;什么是容器&#xff1f;为什么我们需要容器服务&#xff1f;微软容器服务特点是什么&#xff1f;今天我们用一种特殊的方式为大家介绍这三大话题。什么是容器这个部分&#xff0c;我们用一个故事进行开场。很久以前&#…

UWP 推荐 | 限时免费的RSS阅读器《RSS 追踪》登录 Windows 10

前不久&#xff0c;本公号作者 Bravo Yeung 写了一篇不错的关于 RSS 的文章 .Net开发者必知的技术类RSS订阅指南。RSS 现在用的人很少了&#xff0c;而且就算是我&#xff0c;也不过是在一周前才开始正视 RSS 。只因为接触到了一个很好很强大的社区 RSS Hub &#xff0c;当时看…

常见跨域解决方案以及Ocelot 跨域配置

常见跨域解决方案以及Ocelot 跨域配置Intro我们在使用前后端分离的模式进行开发的时候&#xff0c;如果前端项目和api项目不是一个域名下往往会有跨域问题。今天来介绍一下我们在Ocelot网关配置的跨域。什么是跨域跨域:浏览器对于javascript的同源策略的限制,例如a.cn下面的js不…

解读大内老A的《.NET Core框架本质》

老A说的一句话让我很受启发&#xff0c;想要深入了解框架&#xff0c;你要把精力聚焦在架构设计的层面来思考问题。而透彻了解底层原理&#xff0c;最好的笨办法就是根据原理对框架核心进行重建或者说再造。看起来没有捷径&#xff0c;也是最快的捷径。相信很多读者已经看过老A…

Mono和.NET Core 从比翼双飞到合体

.NET 开源之路就是 Mono和.NET Core 从比翼双飞到合体&#xff1a;2001年12月-2002年2月。一个新的平台诞生了。与惠普、英特尔和其他公司一起, 创建了 ECMA-335 标准, 该标准定义了支持多种编程语言的公共语言基础结构&#xff0c;C# 和 Visual Basic. Net。 F # 于2007年晚些…

Skywalking部署常见问题以及注意事项

Skywalking部署常见问题以及注意事项IntroSkyWalking 创建与2015年&#xff0c;提供分布式追踪功能。从5.x开始&#xff0c;项目进化为一个完成功能的Application Performance Management系统。他被用于追踪、监控和诊断分布式系统&#xff0c;特别是使用微服务架构&#xff0c…

GitHub推出包管理服务,npm与Nuget全支持

GitHub 今天推出了一项名为 GitHub Package Registry 的新产品&#xff0c;它提供了软件包管理服务&#xff0c;开发者通过它可发布公共或私有软件包。官方介绍&#xff0c;GitHub Package Registry 完全集成在 GitHub 中&#xff0c;因此和 repo 一样&#xff0c;用户可以使用…

发布dotNetCore程序到Kubernetes

上一篇《Mac中搭建Kubernetes》介绍了怎样在Mac中搭建单节点的Kubernetes&#xff0c;本文将编写一个dotNetCore的示例程序&#xff0c;并发布到Kubernetes中。环境基本步骤创建dotnetCore示例项目&#xff1b;本地搭建私有registry&#xff0c;或者使用DockerHub&#xff0c;本…

[Cake] 2. dotnet 全局工具 cake

在上篇博客[Cake] 1. CI中的Cake中介绍了如何在CI中利用Cake来保持与CI/CD环境的解耦。当时dotnet 2.1还未正式发布&#xff0c;dotnet 还没有工具的支持&#xff0c;使得安装cake非常麻烦。不过随着 dotnet tool 的加入&#xff0c;这一问题得到了很好的解决。目前安装cake&am…

官博翻译 | .NET Core 即 .NET 的未来

点击上方蓝字关注“汪宇杰博客”文 / Scott Hunter译 / 汪宇杰我们在2014年11月推出了.NET Core 1.0。.NET Core 的目标是借鉴我们过去12年构建、发布和服务.NET Framework的经验去构建更好的产品。这些改进如&#xff1a;并行安装&#xff08;您可以安装新版本&#xff0c;而…

微软发布ML.NET 1.0,可一键添加机器学习模型

今天&#xff0c;我们很高兴宣布发布 ML.NET 1.0。ML.NET 是一个免费的、跨平台的开源机器学习框架&#xff0c;旨在将机器学习&#xff08;ML&#xff09;的强大功能引入.NET 应用程序。ML.NET GitHub&#xff1a;https://github.com/dotnet/machinelearning入门 http://dot.…

目前下载VS2017你可能会遇到这个坑

可能现在大伙都已经开始使用VS2019进行开发了。VS2019的下载使用也都很简单。由于工作需要&#xff0c;今天要在笔记本上安装VS2017,结果发现&#xff0c;VS2017的下载变得不是那么容易了&#xff0c;官方的下载方式也隐藏的很深&#xff0c;来来回回折腾了好一会才下载下来&am…

代码整洁之道(Clean Code)- 读书笔记

Sorry, 许久未更新文章了&#xff0c;主要因为刚刚换了一家新公司&#xff0c;忙于组建团队&#xff08;建设、招聘、流程、框架等&#xff09;与熟悉公司业务&#xff0c;还有领导给的其他工作等等&#xff0c;实在是没有时间更新了。最近在和团队分享Bob大叔的《Clean Code》…

微软Build 2019大会.NET课程视频汇总

点击上方蓝字关注“汪宇杰博客”5月6日至8日&#xff0c;微软在西雅图召开了Build 2019开发者大会。我们关注的.NET领域也迎来了许多激动人心的改进。本文汇总了Build 2019大会上关于.NET的已经公开的视频&#xff0c;欢迎大家观看学习&#xff01;// 注意&#xff1a;以下视频…

黑科技抢先尝 | Windows全新终端初体验(附代码Build全过程)

微软在几天前的build大会上展示了Windows Terminal的威力&#xff0c;由于官宣要在6月中旬才上Microsoft store&#xff0c;还有一个多月要等呢。好在代码已公布在 github, 于是决定自己 build 后体验一番。遇到不少坑&#xff0c;大概整理一下流程&#xff0c;分享给大家。如果…

aelf帮助C#工程师10分钟零门槛搭建DAPP私有链开发环境

aelf是一个可扩展的去中心化云计算区块链平台&#xff0c;支持高性能合约并行执行、原生多链数据交互、存储使用高性能分布式数据库。aelf整个系统可以在windows、osx及linux运行&#xff0c;团队在osx环境下开发&#xff0c;基于.net core DAPP开发1.安装.net core及protobufh…

Build 2019 上微软的开源动作有点不一样

微软今年举办的 Build 开发者大会可谓是抢足风头&#xff0c;大会第一天就放了不少大招&#xff1a;宣布新的命令行终端 Windows Terminal、Windows 10 的 Linux 子系统 WSL 2 将运行真正的 Linux 内核、跳过 .NET 4 宣布 .NET 5 的计划、宣布 Web 版本的 VS Code (Visual Stud…