洛谷CF264D Colorful Stones(子序列匹配,思维)
神仙思维题。
对于两个字符串的匹配问题,似乎之前蒟蒻写的HAOI2010最长公共子序列题解中提到的建网格图模型是一种套路?
给一个稍微强一点的样例(把字母换成了ABC)
AABCB
BACBA
它所对应的网格图如下(横轴代表\(s\),纵轴代表\(t\),显示的点表示可达状态)
我们首先可以大致确定,所有的可达状态在一个不规则图形的界内
(红色线条)。第\(i\)行(或列)的界是\([l_i,r_i]\),而且类似two pointers,\(l_i\)和\(r_i\)都随\(i\)单调不降。拐角的顶点\((x,y)\)出现在前缀\(s_x\)和前缀\(t_y\)第一次匹配到其中一个是另一个的子序列的地方。
那么是不是这个界里面的状态都可达呢?显然不是,我们还可以看到这样的位置(中间有三个):如果\(s_x=t_{y-1}\neq s_{x-1}=t_y\)的话,\((x,y)\)也会不可达。对应的两个子串形如AB
和BA
,蒟蒻接下来把该状态记作AB-BA。
仔细观察一下(或者打个表),除了这种情况,还有没有别的情况也是在界内却不可达的?貌似找不到啊。。。。。。
实际上,我们大概可以证明,在这个界内有且仅有AB-BA状态不可达。
图中的若干有向边从前驱节点指向后继节点。显然如果一个状态不可达,那么要么它没有前驱,要么它的所有前驱都不可达。
首先,一个节点没有前驱的情况就只有AB-BA那一种。当\(s_x=t_y\)时,我们可以肯定\((x,y)\)有前驱,随手画画就可以发现。
于是现在我们就需要证明,如果一个点不可达,那么它一定没有前驱,而不会出现它有前驱且前驱不可达。反证法,我们现在开始判定一个在界内的有前驱的节点\((x,y)\),并假设它和它的前驱都不可达。
- 它的前驱中有一个是\((x-1,y-1)\)。刚刚已经得出\((x-1,y-1)\)有前驱,那么我们又需要假设\((x-1,y-1)\)的前驱不可达。
- 它的前驱中没有\((x-1,y-1)\)。则它的前驱可能有\((x-1,y)\)、\((x,y-1)\)。如果\((x-1,y)\)有前驱,那么我们又需要假设\((x-1,y)\)的前驱不可达;如果\((x-1,y)\)没有前驱,那么说明出现了AB-BA状态,则一定会有\((x-1,y-1)\)到\((x,y)\)的边,不符合设定。对\((x,y-1)\)的讨论同理。
于是,我们如果要假设某个点的所有前驱都不可达,我们必须假设它的某一个前驱的所有前驱都不可达,接着是前驱的前驱的前驱。。。。。。这个过程中\(x,y\)在递减,而最终\((x,y)\)到了边界上。显然边界上的点都是可达状态(从\((0,0)\)出发形成一条轮廓状路径),于是所有的假设都被推翻了。
思路清晰了以后,代码就简单了,只需要注意些细节。动态匹配子序列,维护\(l,r\),还有对不同的状态记前缀和,这些都没什么好说的了。
#include<bits/stdc++.h>
#define RG register
#define R RG int
using namespace std;
const int N=1e6+9;
char s[N],t[N];
int f[N][8];
int main(){
R n=0,m=0,x,y,l=0,r=0;
RG long long ans=0;
scanf("%s%s",s,t);
for(n=0;s[n];++n)s[n]%=3;//只是凑巧发现RBG%3的余数不一样
for(m=0;t[m];++m)t[m]%=3;
for(x=1;x<n;++x){
memcpy(f[x],f[x-1],32);//前缀和
if(s[x-1]!=s[x])
++f[x][(s[x-1]>s[x])*4+s[x-1]+s[x]];
}
memcpy(f[n],f[n-1],32);
for(y=0;y<m;++y){
if(y&&t[y-1]!=t[y]){//注意边界
x=(t[y-1]<t[y])*4+t[y-1]+t[y];
ans-=f[r][x]-f[l][x];
}
while(r<n&&s[r]!=t[y])++r;
ans+=r-l+1-(r==n);//同样注意边界
if(r<n)++r;
if(l<r&&s[l]==t[y])++l;
}
cout<<ans<<endl;
return 0;
}
洛谷CF264D Colorful Stones(子序列匹配,思维)的更多相关文章
- 洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)
洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\ ...
- 【洛谷 p3386】模板-二分图匹配(图论)
题目:给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数. 解法:匈牙利算法.(以前我总是不记得......)实质上应该有贪心的思想,每次都尽量匹配,找到能和自己匹配的也尽量让它们匹配 ...
- 洛谷P1637 三元上升子序列
P1637 三元上升子序列 48通过 225提交 题目提供者该用户不存在 标签云端 难度提高+/省选- 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 为什么超时啊 a的数据比较 ...
- 【记录】洛谷P1739-表达式括号匹配AC记
题面请查看:https://www.luogu.org/problem/P1739 思路: 见到括号就搜索,搜到与它配对的括号为止,搜不到就输出NO 代码: #include <bits/std ...
- CF264D - Colorful Stones 题解
题面 官方题解 模拟赛题解 题解概述: 定义符号A~B表示序列A是序列B的子序列,A!~B反之. 设操作序列为I,则有A~I,B!~I,C~I,D!~I. 可得出条件①B!~C且D!~A,所以我们只要 ...
- 洛谷P4424 [HNOI/AHOI2018]寻宝游戏(思维题)
题意 题目链接 Sol 神仙题Orz Orz zbq爆搜70.. 考虑"与"和"或"的性质 \(0 \& 0 = 0, 1 \& 0 = 0\) ...
- 洛谷 P3955 图书管理员【模拟/思维】
题目描述 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个 正整数. 每位借书的读者手中有一个需求码,这个需求码也是一个正整数.如果一本书的图 书编码恰好以读者的需求码结尾,那 ...
- 双栈排序(洛谷P1155)二分图的判定+思维贪心
题目:戳这里 题目大意: 给你一个数列,问能否通过两个栈的push与pop把它输出成一个升序序列(每个数只能入队并出队一次) 不能的话输出0,能的话输出操作方法 主要思路: 1.判断是否可以成功输出升 ...
- 洛谷 P2391.白雪皑皑 (并查集,思维)
题意:有\(n\)个点,对这些点进行\(m\)次染色,第\(i\)次染色会把区间\((i*p+q)\ mod\ N+1\)和\((i*q+p)\ mod\ N+1\)之间的点染成颜色\(i\),问最后 ...
随机推荐
- Average Sleep Time CodeForces - 808B (前缀和)
It's been almost a week since Polycarp couldn't get rid of insomnia. And as you may already know, on ...
- Python删除list里面的重复元素的俩种方法
1.使用set函数 In [116]: a=[1,2,3,2,1,3,4,5,6,5] In [117]: set(a) Out[117]: {1, 2, 3, 4, 5, 6} 2.使用字典函数 ...
- Day2 Numerical simulation of optical wave propagation之标量衍射理论基本原理(二)
2.麦克斯韦方程组的简单行波解 讨论通过线性.各向同性.均匀.无色散.无限电荷和电流的电介质材料的光波传输.在这种情况下,介质具有如下属性: (1)推导获得波动方程( 由麦克斯韦方程组导出的.描述电磁 ...
- java中流的简单小结
1.分类 按字节流分: InputStream(输出流) OutputStream(输入流) 按字符流分: Reader Writer 提示:输入.输出是站在程序的角度而言,所有输入流是“读 ...
- 单列模式,装饰器、new方法、类/静态方法实现单列模式
一.单列模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在. 如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 C ...
- react 组件列表
let data=[ [ '同时入选IMDB250和豆瓣电影250的电影', '带你进入不正常的世界', '用电[影]来祭奠逝去的岁月', '女孩们的故事[电影]', '', '使用 App [找电影 ...
- C# Note5:使用相对路径读取文件
一.C#中使用相对路径读取配置文件 一般Solution的目录结构如下图所示: (如过看不到某些文件,可以点击 “显示所有文件” 图标) 方法一:由于生成的exe文件在bin\debug目录下,可以使 ...
- Spring boot+ logback环境下,日志存放路径未定义的问题
日志路径未定义 环境:Spring boot + logback 配置文件: <configuration> <springProfile name="dev"& ...
- 关于我使用spring mvc框架做文件上传时遇到的问题
非常感谢作者 原文:https://blog.csdn.net/lingirl/article/details/1714806 昨天尝试着用spring mvc框架做文件上传,犯了挺多不该犯的毛病问题 ...
- Spring注解标签详解@Autowired @Qualifier等 @Slf4j
@Slf4j @Slf4j注解实现日志输出 自己写日志的时候,肯定需要: private final Logger logger = LoggerFactory.getLogger(LoggerTes ...