考虑将 \(X\) 复制一次放到后面再对其长度为 \(n\) 的连续子串和 \(Y\) 求一波 \(\rm{Longest\ Common\ Subsequence}\) 就能得到 \(\Theta(n^3)\) 的分数了

那么设 \(f_{i,j,k}\) 表示 \(X[i\dots j],Y[1\dots k]\) 的 \(LCS\)

考虑如下两个性质:

\[f_{i-1,j,k}>f_{i-1,j-1,k}\Rightarrow f_{i,j,k}>f_{i,j-1,k}
\]
\[f_{i,j,k}>f_{i,j,k-1}\Rightarrow f_{i-1,j,k}>f_{i-1,j,k-1}
\]

下文受篇幅限制只证明第一个:

因为这个 \(\rm{DP}\) 类似于网格图上最大带权游走,那么设两个串的左端点为网格图起始点,右端点为终止点

不难发现两条路径必然存在交点,设 \((i-1,0)\) 到 \((j,k)\) 的 最靠左 路径为 \(C_1\),而 \((i,0)\) 到 \((j-1,k)\) 的最靠左的最优路径为 \(C_2\)

设两个路径公共部分是 \(C\),之前是 \(C_1A,C_2A\),之后的是 \(C_1B,C_2B\),把已知和结论统统表示出来互相推就行了

那么必然存在 \(\rm{p(j,k),q(j,k)}\) 满足:

\[\rm{f(i,j,k)=f(i,j-1,k)+[i\ge p(k,j)]=f(i,j,k-1)+[i<q(k,j)]}
\]

至此可以得到所有 \(p(n,x)\) 然后使用第一个等号后的式子递推 \(\rm{f(x,x+n-1,n)}\) 即可

考虑如何转移 \(\rm{p,q}\)?

设 \(P=p_{k-1,j},Q=q_{k,j-1}\)(认真注意变量定义)

  • \(X_i\ne Y_j\)

    如果 \(P<Q\),把 \(f_{i,j-1,k},f_{i,j,k-1}\) 的转移结果写出来就能发现 \(p(k,j)=Q,q(k,j)=P\),因为 \(f_{i,j,k}\ge \max\{f_{i,j-1,k},f_{i,j,k-1}\}\)

    而对于 \(P\ge Q\) 的情况,仍然是写出来转移的结果得到 \(p_{i,j}=P,q(i,j)=Q\)

  • \(X_i=Y_j\)

    这里必然会有 \(f_{i,j,k}=f_{i,j-1,k-1}+1\),那么分开讨论究竟是哪边加了 \(1\),对转移有贡献的如下:

    如果 \(f_{i,j,k}=f_{i,j-1,k}+1\),即上次不能转移,但是现在可以,那么必然满足 \(i\ge Q,p(k,j)=Q\)

    如果 \(f_{i,j,k}=f_{i,j,k-1}\),即提前转移过了,现在不能转移,那么必然满足 \(i\ge P,q(k,j)=p\)

这样就可以了! 时间复杂度 \(O(n^2)\)

$\texttt{Talk is cheap,Show the Code}$
const int N=2010;
int p[N][N<<1],q[N][N<<1],f[N<<1][N<<1],n,ans;
char x[N<<1],y[N];
signed main(){
n=read(); scanf("%s%s",x+1,y+1); rep(i,1,n) x[i+n]=x[i];
rep(i,1,n*2) p[0][i]=i+1; rep(i,1,n*2) q[0][i]=1;
rep(i,1,n) rep(j,1,(n<<1)){
int P=p[i-1][j],Q=q[i][j-1];
if(P>=Q&&x[j]!=y[i]) p[i][j]=P,q[i][j]=Q;
else p[i][j]=Q,q[i][j]=P;
}
rep(i,0,(n<<1)) rep(j,i,(n<<1)) f[i][j]=f[i][j-1]+(i>=p[n][j]);
rep(i,1,n) ckmax(ans,f[i][i+n-1]); print(ans); return 0;
}
//Use The Time To Enrich This Selfclosing Youth

「山东省队集训2021 Round 1」 半夜的更多相关文章

  1. 【考试记录】2018 山东省队集训第一轮D4(雾)

    T1题意: 给你一个$n\times m$的矩阵$B$,求它能由最少多少个形如两个向量之积$(n\times 1)\times(1\times m)$的矩阵相加得到. 题解: 考虑上界,最多需要$mi ...

  2. #6164. 「美团 CodeM 初赛 Round A」数列互质-莫队

    #6164. 「美团 CodeM 初赛 Round A」数列互质 思路 : 对这个题来言,莫队可以 n*根号n 离线处理出各个数出现个的次数 ,同时可以得到每个次数出现的次数 , 但是还要处理有多少 ...

  3. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 …… 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

  4. LOJ_6045_「雅礼集训 2017 Day8」价 _最小割

    LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...

  5. 「雅礼集训 2017 Day7」事情的相似度

    「雅礼集训 2017 Day7」事情的相似度 题目链接 我们先将字符串建后缀自动机.然后对于两个前缀\([1,i]\),\([1,j]\),他们的最长公共后缀长度就是他们在\(fail\)树上对应节点 ...

  6. 「雅礼集训 2017 Day2」解题报告

    「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...

  7. 「雅礼集训 2017 Day1」 解题报告

    「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...

  8. [LOJ 6031]「雅礼集训 2017 Day1」字符串

    [LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...

  9. [LOJ 6030]「雅礼集训 2017 Day1」矩阵

    [LOJ 6030] 「雅礼集训 2017 Day1」矩阵 题意 给定一个 \(n\times n\) 的 01 矩阵, 每次操作可以将一行转置后赋值给某一列, 问最少几次操作能让矩阵全为 1. 无解 ...

随机推荐

  1. jquery 中 live() 对于js的需求版本导致不可用解决办法

    $('body').on('click','.edit', function() {            var id = $(this).parent().attr('id');          ...

  2. Supervisord 远程命令执行漏洞(CVE-2017-11610)

    漏洞影响范围: Supervisor version 3.1.2至Supervisor version 3.3.2 poc 地址.https://github.com/vulhub/vulhub/tr ...

  3. IO多路复用详解

    假如你想了解IO多路复用,那本文或许可以帮助你 本文的最大目的就是想要把select.epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别. 基础知识 IO多路复 ...

  4. netty系列之:netty中的Channel详解

    目录 简介 Channel详解 异步IO和ChannelFuture Channel的层级结构 释放资源 事件处理 总结 简介 Channel是连接ByteBuf和Event的桥梁,netty中的Ch ...

  5. [.NET大牛之路 005] .NET 的执行模型

    .NET大牛之路 • 王亮@精致码农 • 2021.07.06 前面我们介绍 .NET 历史时讲过,微软基于 .NET Framework 重新设计并创造了跨平台的 .NET Core,目前已经发展到 ...

  6. 为了彻底搞懂 hashCode,我钻了一下 JDK 的源码

    今天我们来谈谈 Java 中的 hashCode() 方法--通过源码的角度.众所周知,Java 是一门面向对象的编程语言,所有的类都会默认继承自 Object 类,而 Object 的中文意思就是& ...

  7. 揭秘阿里云 RTS SDK 是如何实现直播降低延迟和卡顿

    作者:予涛 途坦 这个夏天,没什么能够比一场酣畅淋漓的奥运比赛来的过瘾.但是,在视频平台直播观看比赛也有痛点:"卡顿" 和 "延时".受限于不同地域.复杂的网络 ...

  8. PostgreSQL 时间转换

    背景:最近频繁使用到时间转换相关的操作,特此小记. 1.实时取最近24小时内数据. select now() - interval '24h'; 通过sql获得符合要求的时间段,当做where条件即可 ...

  9. Git(6)-- 记录每次更新到仓库(git clone、status、add、diff、commit、rm、mv命令详解)

    @ 目录 1.克隆现有仓库:git clone 2.检查当前文件状态 :git status 3.跟踪新文件:git add 4.暂存已修改的文件:git add 5.状态简览: git status ...

  10. 开源中国【面经】Java后台开发

    2021.04.09 直接正文: 开场自我介绍,说一下自己 有没有实习经历?(毕业实习) 毕业实习学了什么?(前端) 有什么大项目吗?(除了课设就是毕设) 能说一下毕设的情况吗?(做了大概,没有开始登 ...