洛谷题目传送门

神仙思维题。

对于两个字符串的匹配问题,似乎之前蒟蒻写的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. Python学习第四篇——列表访问与判定

    avilable_foods=["soup","beaf","noddle","pepper"] request_foo ...

  2. python os模块详解

    一.Python os模块(Linux环境) 1.1 执行shell命令 os.system('cmd') 执行命令不保存结果 os.popen('command') 执行后返回结果,使用.read( ...

  3. Python之列表

    一.列表的特点 列表也是一种数据类型 列表元素是有序的,有编号的 列表元素的下标从0开始 列表中的每一个值叫一个元素,编号叫下标(索引/角标): stu_name=['崔海龙','杨帆','lrx', ...

  4. react组件选项卡demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. maven+springmvc项目启动时,request mapping not found……

    springmvc项目跑的好好的,跑着跑着,出现request mapping not found的问题. 第一波,网上查问题,stackoverflow上面的各种配置说明,但是我本地就是没查出问题 ...

  6. Golang的Json encode/decode以及[]byte和string的转换

    使用了太长时间的python,对于强类型的Golang适应起来稍微有点费力,不过操作一次之后发现,只有这么严格的类型规定,才能让数据尽量减少在传输和解析过程中的错误.我尝试使用Golang创建了一个公 ...

  7. linode上切换Linux到FreeBSD

    PS:不是真正的无缝切换,数据需要自己备份.还原. Linode官方给出了一篇文章:https://www.linode.com/docs/tools-reference/custom-kernels ...

  8. HTML 中的 href\src\url

    1. 2. -------from Stack Overflow <a><link>使用 href; <img><script>使用 src;

  9. Ajax 长轮询

    长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求. 优点:在无消息的情况下不会频繁的请求. 缺 ...

  10. windows下ping端口

    上图的操作完成以后  进入dos控制台 输入telnet  ip地址  端口号   回车 标识已ping通 ping不通是这种提示