[XSY] 宝藏(LCS,DP)

宝藏

首先,这个问题等价于给定两个字符串S,T ,每次询问LCS(S[1,n],T[x,y])LCS(S[1,n],T[x,y])LCS(S[1,n],T[x,y])
对每个询问重新求一遍LCSLCSLCS显然不现实,又因为yyy都是连续变化的,我们考虑探讨
LCS(S[1,n],T[x,y])与LCS(S[1,n],T[x,y−1])的关系:\color{Red}{LCS(S[1,n],T[x,y])与LCS(S[1,n],T[x,y-1])的关系:}LCS(S[1,n],T[x,y])LCS(S[1,n],T[x,y1])

其实很明显LCS(S[1,n],T[x,y])=LCS(S[1,n],T[x,y−1])或LCS(S[1,n],T[x,y−1])+1LCS(S[1,n],T[x,y])=LCS(S[1,n],T[x,y-1])或LCS(S[1,n],T[x,y-1])+1LCS(S[1,n],T[x,y])=LCS(S[1,n],T[x,y1])LCS(S[1,n],T[x,y1])+1
相等的情况可以不用管,我们只要关注什么情况下加上yyy后匹配数会+1

设一个大写字母代表定义一个字符串,一个小写字母代表定义一个字符

引理
所有满足LCS(S,Py)=LCS(S,P)+1LCS(S,Py)=LCS(S,P)+1LCS(S,Py)=LCS(S,P)+1的位置构成T的一个后缀
证明
LCS(S,Py)=LCS(S,P)+1LCS(S,Py)=LCS(S,P)+1LCS(S,Py)=LCS(S,P)+1
LCS(S,Gy)=LCS(S,G)+1LCS(S,Gy)=LCS(S,G)+1LCS(S,Gy)=LCS(S,G)+1(GGGPPP的后缀)
SSS中至少有一个yyyPPP匹配不到的,
GGG也是匹配不到这个yyy的,所以多加一个yyy一定会让匹配数+1

也就是说,假设iii是满足LCS(S,T[i,y])=LCS(S,T[i,y−1])+1LCS(S,T[i,y])=LCS(S,T[i,y-1])+1LCS(S,T[i,y])=LCS(S,T[i,y1])+1的位置中最靠前的,那么
∀j>=i满足LCS(S,T[j,y])=LCS(S,T[j,y−1])+1\forall j>=i满足LCS(S,T[j,y])=LCS(S,T[j,y-1])+1j>=iLCS(S,T[j,y])=LCS(S,T[j,y1])+1
也就是说,只要我们找到这个位置最靠前的iii,便能找到所有jjj

现在就可以考虑 dp 了。设f(i,j)f(i,j)f(i,j)表示考虑了SSS长度为iii的前缀、TTT长度为jjj的前缀,T[1,j]T[1,j]T[1,j] 最长的后缀PyPyPy满足LCS(S[1,i],Py)=LCS(S[1,i],P)+1LCS(S[1,i],Py)=LCS(S[1,i],P)+1LCS(S[1,i],Py)=LCS(S[1,i],P)+1f(i,j)f(i,j)f(i,j)表示PyPyPy的起始位置。

考虑f(i,j)f(i,j)f(i,j)的转移:
先把LCSLCSLCS的转移式打出来:
LCSi,j={LCSi−1,j−1+1(S[i]==T[j])max{LCSi−1,j,LCSi,j−1}(S[i]!=T[j])LCS_{i,j}=\left\{ \begin{aligned} &LCS_{i-1,j-1}+1(S[i]==T[j]) \\ & max\{LCS_{i-1,j},LCS_{i,j-1}\} (S[i]!=T[j])\\ \end{aligned} \right. LCSi,j={LCSi1,j1+1(S[i]==T[j])max{LCSi1,j,LCSi,j1}(S[i]!=T[j])
S[i]=yS[i]=yS[i]=y
则根据LCSLCSLCS的转移式,
LCS(S[1,i],Py)=LCS(S[1,i−1],P)+1LCS(S[1,i],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i],Py)=LCS(S[1,i1],P)+1
∵LCS(S[1,i],Py)=LCS(S[1,i],P)+1\because LCS(S[1,i],Py)=LCS(S[1,i],P)+1LCS(S[1,i],Py)=LCS(S[1,i],P)+1
∴LCS(S[1,i−1],P)=LCS(S[1,i],P)\therefore LCS(S[1,i-1],P)=LCS(S[1,i],P)LCS(S[1,i1],P)=LCS(S[1,i],P)
∴LCS(S[1,i],Py)=LCS(S[1,i],P)+1⇒LCS(S[1,i−1],P)=LCS(S[1,i],P)\therefore LCS(S[1,i],Py)=LCS(S[1,i],P)+1\Rightarrow LCS(S[1,i-1],P)=LCS(S[1,i],P)LCS(S[1,i],Py)=LCS(S[1,i],P)+1LCS(S[1,i1],P)=LCS(S[1,i],P)

我们不妨新设一个状态g(i,j)g(i,j)g(i,j),表示在T[1,j]T[1,j]T[1,j]里找最长的后缀QQQ满足LCS(S[1,i−1],T[1,j])=LCS(S[1,i],T[1,j])LCS(S[1,i-1],T[1,j])=LCS(S[1,i],T[1,j])LCS(S[1,i1],T[1,j])=LCS(S[1,i],T[1,j])g(i,j)g(i,j)g(i,j)表示QQQ的起点位置

∴f(i,j)=g(i,j−1)\therefore f(i,j)=g(i,j-1)f(i,j)=g(i,j1)

S[i]!=yS[i]!=yS[i]!=y
则根据LCSLCSLCS的转移式,
LCS(S[1,i],Py)=max{LCS(S[1,i−1],Py),LCS(S[1,i],P)}LCS(S[1,i],Py)=max\{LCS(S[1,i-1],Py),LCS(S[1,i],P)\}LCS(S[1,i],Py)=max{LCS(S[1,i1],Py),LCS(S[1,i],P)}
∵LCS(S[1,i],Py)=LCS(S[1,i],P)+1\because LCS(S[1,i],Py)=LCS(S[1,i],P)+1LCS(S[1,i],Py)=LCS(S[1,i],P)+1
∴LCS(S[1,i−1],Py)=LCS(S[1,i],P)+1\therefore LCS(S[1,i-1],Py)=LCS(S[1,i],P)+1LCS(S[1,i1],Py)=LCS(S[1,i],P)+1
LCS(S[1,i],P)=LCS(S[1,i−1],P)+1LCS(S[1,i],P)=LCS(S[1,i-1],P)+1LCS(S[1,i],P)=LCS(S[1,i1],P)+1
LCS(S[1,i−1],Py)=LCS(S[1,i−1],P)+2(舍)LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)+2(舍)LCS(S[1,i1],Py)=LCS(S[1,i1],P)+2()
∴LCS(S[1,i],P)=LCS(S[1,i−1],P)\therefore LCS(S[1,i],P)=LCS(S[1,i-1],P)LCS(S[1,i],P)=LCS(S[1,i1],P)
∴LCS(S[1,i],Py)=LCS(S[1,i],P)+1⇒{LCS(S[1,i],P)=LCS(S[1,i−1],P)LCS(S[1,i−1],Py)=LCS(S[1,i−1],P)+1\therefore LCS(S[1,i],Py)=LCS(S[1,i],P)+1\Rightarrow \left\{ \begin{aligned} &LCS(S[1,i],P)=LCS(S[1,i-1],P) \\ & LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)+1\\ \end{aligned} \right. LCS(S[1,i],Py)=LCS(S[1,i],P)+1{LCS(S[1,i],P)=LCS(S[1,i1],P)LCS(S[1,i1],Py)=LCS(S[1,i1],P)+1
∴f(i,j)=max{f(i−1,j),g(i,j−1)}\therefore f(i,j)=max\{f(i −1,j),g(i,j−1)\}f(i,j)=max{f(i1,j),g(i,j1)}

再考虑g(i,j)g(i,j)g(i,j)的转移:
Q=PyQ=PyQ=Py
S[i]=yS[i]=yS[i]=y
则根据LCSLCSLCS的转移式,
LCS(S[1,i],Py)=LCS(S[1,i−1],P)+1LCS(S[1,i],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i],Py)=LCS(S[1,i1],P)+1
∵LCS(S[1,i−1],Py)=LCS(S[1,i],Py)\because LCS(S[1,i-1],Py)=LCS(S[1,i],Py)LCS(S[1,i1],Py)=LCS(S[1,i],Py)
∴LCS(S[1,i−1],Py)=LCS(S[1,i−1],P)+1\therefore LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i1],Py)=LCS(S[1,i1],P)+1
∴LCS(S[1,i−1],Py)=LCS(S[1,i],Py)⇒\therefore LCS(S[1,i-1],Py)=LCS(S[1,i],Py)\RightarrowLCS(S[1,i1],Py)=LCS(S[1,i],Py)
LCS(S[1,i−1],Py)=LCS(S[1,i−1],P)+1LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i1],Py)=LCS(S[1,i1],P)+1
∴g(i,j)=f(i−1,j)\therefore g(i,j) = f(i−1,j)g(i,j)=f(i1,j)

S[i]!=yS[i]!=yS[i]!=y
引理
LCS(Ax,By)<=LCS(A,B)+1LCS(Ax,By)<=LCS(A,B)+1LCS(Ax,By)<=LCS(A,B)+1
证明
x=yx=yx=y
LCS(Ax,By)=LCS(A,B)+1LCS(Ax,By)=LCS(A,B)+1LCS(Ax,By)=LCS(A,B)+1,引理显然成立
x!=yx!=yx!=y
∵{LCS(A,By)<=LCS(A,B)+1LCS(Ax,By)<=LCS(A,B)+1\because \left\{ \begin{aligned} &LCS(A,By)<=LCS(A,B)+1 \\ & LCS(Ax,By)<=LCS(A,B)+1\\ \end{aligned} \right. {LCS(A,By)<=LCS(A,B)+1LCS(Ax,By)<=LCS(A,B)+1
∴LCS(Ax,By)=max{LCS(A,By),LCS(Ax,B)}<=LCS(A,B)+1\therefore LCS(Ax,By)=max\{LCS(A,By),LCS(Ax,B)\}<=LCS(A,B)+1LCS(Ax,By)=max{LCS(A,By),LCS(Ax,B)}<=LCS(A,B)+1

根据LCSLCSLCS的转移式,
LCS(S[1,i],Py)=max{LCS(S[1,i−1],Py),LCS(S[1,i],P)}LCS(S[1,i],Py)=max\{LCS(S[1,i-1],Py),LCS(S[1,i],P)\}LCS(S[1,i],Py)=max{LCS(S[1,i1],Py),LCS(S[1,i],P)}

LCS(S[1,i−1],Py)=LCS(S[1,i−1],P)LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)LCS(S[1,i1],Py)=LCS(S[1,i1],P)
LCS(S[1,i],P)=LCS(S[1,i−1],P)LCS(S[1,i],P)=LCS(S[1,i-1],P)LCS(S[1,i],P)=LCS(S[1,i1],P)

LCS(S[1,i−1],Py)=LCS(S[1,i−1],P)+1LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i1],Py)=LCS(S[1,i1],P)+1
则根据引理,LCS(S[1,i],Py)=LCS(S[1,i−1],P)+1LCS(S[1,i],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i],Py)=LCS(S[1,i1],P)+1
∴LCS(S[1,i−1],Py)=LCS(S[1,i],Py)必成立\therefore LCS(S[1,i-1],Py)=LCS(S[1,i],Py)必成立LCS(S[1,i1],Py)=LCS(S[1,i],Py)

∴LCS(S[1,i−1],Py)=LCS(S[1,i],Py)⇒\therefore LCS(S[1,i-1],Py)=LCS(S[1,i],Py)\RightarrowLCS(S[1,i1],Py)=LCS(S[1,i],Py)
LCS(S[1,i],P)=LCS(S[1,i−1],P)或LCS(S[1,i−1],Py)=LCS(S[1,i−1],P)+1LCS(S[1,i],P)=LCS(S[1,i-1],P)或LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i],P)=LCS(S[1,i1],P)LCS(S[1,i1],Py)=LCS(S[1,i1],P)+1
∴g(i,j)=min{f(i−1,j),g(i,j−1)}\therefore g(i, j) =min\{f(i−1, j), g(i,j−1)\}g(i,j)=min{f(i1,j),g(i,j1)}

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5005;
const ll mod=998244353;
int n,m,s[N],t[N];
int f[N][N],g[N][N],c[N];
ll p[N],ans[N];
int main(){scanf("%d%d",&n,&m);p[0]=1;for(int i=1;i<=m;i++) p[i]=p[i-1]*233%mod;for(int i=1;i<=n;i++) scanf("%d",&s[i]);for(int i=1;i<=m;i++) scanf("%d",&t[i]);for(int i=0;i<=m;i++) f[0][i]=i+1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i]==t[j]){f[i][j]=g[i][j-1];g[i][j]=f[i-1][j];}else{f[i][j]=max(f[i-1][j],g[i][j-1]);g[i][j]=min(f[i-1][j],g[i][j-1]);}} }for(int i=1;i<=m;i++){for(int j=f[n][i];j<=i;j++) c[j]++;for(int j=1;j<=i;j++)  ans[j]=(ans[j]+c[j]*p[i-j]%mod)%mod;}for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);return 0;
}

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

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

相关文章

【DP】数的划分(ybtoj DP-1-3)

数的划分 ybtoj DP-1-1 题目大意 给你一个n&#xff0c;让你分成k份&#xff0c;问有多少种分法&#xff08;1,2和2,1为同一种&#xff09; 输入样例 7 3输出样例 4 样例解释 四种分法为&#xff1a;1,1,5;1,2,4;1,3,3;2,2,3.1,1,5; \ \ 1,2,4; \ \ 1,3,3; \ \ 2,2,3.1…

CF570D-Tree Requests【长链剖分】

正题 题目链接:https://www.luogu.com.cn/problem/CF570D 题目大意 nnn个点的一棵树&#xff0c;每个节点有字母&#xff0c;每次询问一个节点xxx的子树中深度为kkk的所有点的字母能否经过重排构成一个回文串。 解题思路 首先把每个字母的奇偶状压一下 然后方法比较多&#x…

牛客网 【每日一题】5月13日 加分二叉树

试题链接&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld题目描述 设一个n个节点的二叉树tree的中序遍历为&#xff0…

Visual Studio 2017 15.8概览

Microsoft正式发布VS2017的第八次更新&#xff0c;即15.8。15.8提供了今年夏天预览的大量新特性&#xff0c;包括Code Cleanup、IDE支持多重查补&#xff08;Multiple Caret&#xff09;、Visual Studio Code和ReSharper快捷键设置等。各类开发人员均可受益于这些已供使用的新特…

[XSY] 简单的数论题(数学、构造)

简单的数论题 m(a3b3)n(c3d3)m(a^3b^3)n(c^3d^3)m(a3b3)n(c3d3) 考虑因式分解(a3b3),(c3d3):考虑因式分解(a^3b^3),(c^3d^3):考虑因式分解(a3b3),(c3d3): a3b3(ab)3−3ab(ab)(ab)(a2b2−ab)a^3b^3(ab)^3-3ab(ab)(ab)(a^2b^2-ab)a3b3(ab)3−3ab(ab)(ab)(a2b2−ab) c3d3(cd)3−3c…

P4322-[JSOI2016]最佳团体【0/1分数规划,树形背包】

正题 题目链接:https://www.luogu.com.cn/problem/P4322 题目大意 nnn个点的一棵树&#xff0c;每个节点有一个(si,pi)(s_i,p_i)(si​,pi​)&#xff0c;选择一个点必须选择它的父节点&#xff0c;求选择KKK个点使得∑pxi∑sxi\frac{\sum p_{x_i}}{\sum s_{x_i}}∑sxi​​∑px…

【DP】平铺方案(ybtoj DP-1-5)

平铺方案 ybtoj DP-1-5 题目大意 求用121\times 212和222\times 222的瓦片平铺2n2\times n2n矩形的方案数 输入样例 2 8 12 100 200输出样例 3 171 2731 845100400152152934331135470251 1071292029505993517027974728227441735014801995855195223534251数据范围 0⩽n⩽2…

白兔的字符串

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 白兔有一个字符串T。白云有若干个字符串S1,S2…Sn。 白…

利用.NET Core类库System.Reflection.DispatchProxy实现简易Aop

Aop即是面向切面编程&#xff0c;众多Aop框架里Castle是最为人所知的&#xff0c;另外还有死去的Spring.NET&#xff0c;当然&#xff0c;.NET Core社区新秀AspectCore在性能与功能上都非常优秀&#xff0c;已经逐渐被社区推崇和有越来越多的人使用。感谢柠檬同学的礼物&#x…

P6348-[PA2011]Journeys【线段树优化建图,最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P6348 题目大意 nnn个点的一张图&#xff0c;mmm条边表示区间[a,b][a,b][a,b]向区间[c,d][c,d][c,d]连边&#xff0c;求单源最短路。 解题思路 线段树优化建图的裸题&#xff0c;但是不能直接让线段树上的点两两建边&#xf…

[XSY] 简单的博弈题(博弈+dp+组合数+容斥)

简单的博弈题 对于贪心的对手&#xff0c;显然用最大的一半和他最小的一半比较判断是否全胜。&#xff08;这不就是田忌赛马吗&#xff09; 对于随机的对手&#xff0c;先考虑暴力怎么做&#xff1a; void check(int x,int w){if(x>m){res(w>m/21);return;}for(int i1;…

【矩阵乘法】沼泽鳄鱼(ssl 2511)

沼泽鳄鱼 ssl 2511 题目大意 给你一个无向图&#xff0c;有一些鳄鱼有周期性地在这个图中走&#xff08;鳄鱼不用沿着边走&#xff0c;周期为2或3或4&#xff09;&#xff0c;问你从初始点走到最终点走k个单位时间&#xff0c;不在点和边上停下&#xff0c;不在同一时间和鳄…

Matrix(二维hash)

题目链接 文章目录题目描述题意&#xff1a;题解代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 给定一个M行N列的01矩阵&#xff08;只包含数字0或1的矩阵&am…

当我们谈高性能时,我们谈些什么?(送书活动)

网站越快&#xff0c;用户的黏性就越高&#xff1b;网站越快&#xff0c;用户忠诚度更高&#xff1b;网站越快&#xff0c;用户转化率越高。简言之&#xff0c;速度是关键。——《Web 性能权威指南》显然&#xff0c;高性能意味着“快”。但对快的定义&#xff0c;在不同的系统…

P5355-[Ynoi2017]由乃的玉米田【莫队,bitset,根号分治】

正题 题目链接:https://www.luogu.com.cn/problem/P5355 顺带一提的是P3674 小清新人渣的本愿是这题的弱化版&#xff0c;提交就可以A 题目大意 nnn个数字&#xff0c;询问 一个区间是否有两个数a,ba,ba,b使得abxabxabx一个区间是否有两个数a,ba,ba,b使得a−bxa-bxa−bx一个区…

[XSY] 字符串题(字符串,构造)

字符串题 考虑找到一种方法&#xff0c;能够对一个 lyndon 串 A &#xff0c;直接求出 A 的下一个 lyndon 串。考虑不断复制 A &#xff0c;得 AAA…A因为 lyndon 串是自身循环移位得到的串中字典序严格最小的&#xff0c;所以 AAA…A 非lyndon 串。考虑微调&#xff1a;将 AA…

【DP】划分数列(ybtoj DP-2-1)

划分数列 ybtoj DP-2-1 题目大意 给你一个数列&#xff0c;让你划分出最少的段数&#xff0c;使每段要么单调不降&#xff0c;要么单调不增 输入样例#1 6 1 2 3 2 2 1 输出样例#1 2 输入样例#2 9 1 2 1 2 1 2 1 2 1 输出样例#2 5 输入样例#3 7 1 2 3 2 1 99999999…

Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

什么是Generic Host ?这是在Asp.Net Core 2.1加入了一种新的Host&#xff0c;现在2.1版本的Asp.Net Core中&#xff0c;有了两种可用的Host。Web Host –适用于托管Web程序的Host,就是我们所熟悉的在Asp.Net Core应用程序的Mai函数中用CreateWebHostBuilder创建出来的常用的We…

牛客网【每日一题】5月19日题目精讲 比赛

链接&#xff1a; 文章目录题目描述题意题解&#xff1a;代码时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld题目描述 你在打比赛&#xff0c;这场比赛总共有12个题 对于第i个题&…

P3704-[SDOI2017]数字表格【莫比乌斯反演】

正题 题目链接:https://www.luogu.com.cn/problem/P3704 题目大意 TTT组询问&#xff0c;给出n,mn,mn,m求∏i1n∏j1mFbigcd(i,j)\prod_{i1}^n\prod_{j1}^mFbi_{gcd(i,j)}i1∏n​j1∏m​Fbigcd(i,j)​ 其中FbixFbi_xFbix​表示第xxx项斐波那契数列。 解题思路 答案就是∏x1nFb…