洛谷题目传送门

神仙思维题。

对于两个字符串的匹配问题,似乎之前蒟蒻写的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)\)也会不可达。对应的两个子串形如ABBA,蒟蒻接下来把该状态记作AB-BA。

仔细观察一下(或者打个表),除了这种情况,还有没有别的情况也是在界内却不可达的?貌似找不到啊。。。。。。

实际上,我们大概可以证明,在这个界内有且仅有AB-BA状态不可达。

图中的若干有向边从前驱节点指向后继节点。显然如果一个状态不可达,那么要么它没有前驱,要么它的所有前驱都不可达。

首先,一个节点没有前驱的情况就只有AB-BA那一种。当\(s_x=t_y\)时,我们可以肯定\((x,y)\)有前驱,随手画画就可以发现。

于是现在我们就需要证明,如果一个点不可达,那么它一定没有前驱,而不会出现它有前驱且前驱不可达。反证法,我们现在开始判定一个在界内的有前驱的节点\((x,y)\),并假设它和它的前驱都不可达。

  1. 它的前驱中有一个是\((x-1,y-1)\)。刚刚已经得出\((x-1,y-1)\)有前驱,那么我们又需要假设\((x-1,y-1)\)的前驱不可达。
  2. 它的前驱中没有\((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(子序列匹配,思维)的更多相关文章

  1. 洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)

    洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\ ...

  2. 【洛谷 p3386】模板-二分图匹配(图论)

    题目:给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数. 解法:匈牙利算法.(以前我总是不记得......)实质上应该有贪心的思想,每次都尽量匹配,找到能和自己匹配的也尽量让它们匹配 ...

  3. 洛谷P1637 三元上升子序列

    P1637 三元上升子序列 48通过 225提交 题目提供者该用户不存在 标签云端 难度提高+/省选- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 为什么超时啊 a的数据比较 ...

  4. 【记录】洛谷P1739-表达式括号匹配AC记

    题面请查看:https://www.luogu.org/problem/P1739 思路: 见到括号就搜索,搜到与它配对的括号为止,搜不到就输出NO 代码: #include <bits/std ...

  5. CF264D - Colorful Stones 题解

    题面 官方题解 模拟赛题解 题解概述: 定义符号A~B表示序列A是序列B的子序列,A!~B反之. 设操作序列为I,则有A~I,B!~I,C~I,D!~I. 可得出条件①B!~C且D!~A,所以我们只要 ...

  6. 洛谷P4424 [HNOI/AHOI2018]寻宝游戏(思维题)

    题意 题目链接 Sol 神仙题Orz Orz zbq爆搜70.. 考虑"与"和"或"的性质 \(0 \& 0 = 0, 1 \& 0 = 0\) ...

  7. 洛谷 P3955 图书管理员【模拟/思维】

    题目描述 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个 正整数. 每位借书的读者手中有一个需求码,这个需求码也是一个正整数.如果一本书的图 书编码恰好以读者的需求码结尾,那 ...

  8. 双栈排序(洛谷P1155)二分图的判定+思维贪心

    题目:戳这里 题目大意: 给你一个数列,问能否通过两个栈的push与pop把它输出成一个升序序列(每个数只能入队并出队一次) 不能的话输出0,能的话输出操作方法 主要思路: 1.判断是否可以成功输出升 ...

  9. 洛谷 P2391.白雪皑皑 (并查集,思维)

    题意:有\(n\)个点,对这些点进行\(m\)次染色,第\(i\)次染色会把区间\((i*p+q)\ mod\ N+1\)和\((i*q+p)\ mod\ N+1\)之间的点染成颜色\(i\),问最后 ...

随机推荐

  1. MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义

     varchar与char的区别: 1).varchar与char的区别char是一种固定长度的类型,varchar则是一种可变长度的类型 尽可能的使用 varchar 代替 char ,因为首先变长 ...

  2. 钢琴培训班课程、课时及费用管理系统已提供ACM3.0新版下载

    中小型艺术培训班课程.课时及费用管理系统. 2014新版 ACM3测试版下载:http://www.cnblogs.com/Charltsing/p/ACM3.html 您有任何功能需求,欢迎QQ 5 ...

  3. 泛函p121可分Hilbert空间都同构于l^2

    如何理解最后面两句话, L^2与l^2同构 L^2里面 有理系数多项式 是可数稠密子集 所以L^2可分 可分Hilbert空间都同构于 l^2 傅里叶级数是一个稠密的子集

  4. git rebase的用法

    改变基 一个git库,开发人员在master分支的Bcommit的时候,创建了一个dev分支,此时Bcommit是dev分支的基,然后分别进行两个分支的开发. 进行到master提交了Dcommit, ...

  5. 分析一个react项目

    目录结构 下面是使用npx create-react-app web-app来创建的一个项目(已经删除了多余的文件) web-app ├── node_modules │   ├── ....... ...

  6. Linux 典型应用之WebServer 安装和配置

    Apache的基本操作 安装 yum install httpd 启动 service httpd start  在浏览器中输入以下Ip 发现无法访问 http://192.168.1.109/ 输入 ...

  7. Windows 10正式版历代记:Version 和 Build 对应关系

    2017年10月中下旬,微软面向正式版用户推送了Windows 10创意者更新秋季版.这是自发布以来,Windows 10的第五个大版本. 在这篇文章中,我们来回顾一下Windows 10正式版的历史 ...

  8. php之常用扩展总结

    在此总结,开发中经常使用到的扩展,来进行日常PHP的开发工作 bcmath(精确数值处理) bz2 calendar Core ctype curl date dom ereg exif filein ...

  9. Oracle undo 表空间不可用

    由于某次不小心操作,在切换表空间时没有成功,由于把undo的配置参数 undo_management值设置为MANUAL所以在启动数据库时没有报任何错误,但是给表插入数据时报错了,回滚段不可用的错误. ...

  10. Docker 给 故障停掉的 container 增加 restart 参数

    操作过程见图: 执行的命令比较简单: docker container update --restart=always containername 即可.