最长公共子序列【省选模拟赛】
标签:DP
题目
n<=1e5,m<=26
分析
O(n)判断两个长度为n的串的LCS长度为n-1
令f[i][j] (j∈[-1,0,1])表示第一个串到第i个数,第二个串到第i-j个数的LCS
对于f[i][-1],f[i][0],f[i][1],它们之间的差一定不会超过1,且不会变小,因此可以用二进制来表示状态
然后DP套DP解决
code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
#define mem(x,num) memset(x,num,sizeof x)
#define reg(x) for(int i=last[x];i;i=e[i].next)
using namespace std;
inline ll read()
{ll f=1,x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
const int maxn=1e5+6;
ll f[maxn][2][2][2],ans;
int n,m;char st[maxn];
int main()
{n=read(),m=read();scanf("%s",st);if(n==1){cout<<m-1<<endl;return 0;}f[1][1][1][1]=1;if(st[0]==st[1])f[1][1][0][0]=m-1;else f[1][1][0][1]=1,f[1][1][0][0]=m-2;rep(i,1,n-1)rep(k,0,1)rep(l,0,1)rep(t,0,1)if(f[i][k][l][t])rep(j,1,m){int X=l+i-1,Y=t+i-1;if(j==st[i-1]-'a'+1)X=max(X,k+i-2+1);if(j==st[i-1]-'a'+1)Y=max(Y,k+i-2+1);if(j==st[i]-'a'+1)Y=max(Y,l+i-1+1);int Z=Y;if(j==st[i+1]-'a'+1)Z=max(Z,max(l-i-1+1,t+i-1+1));X-=(i-1);Y-=i;Z-=i;if(X>=0&&Y>=0&&Z>=0)f[i+1][X][Y][Z]+=f[i][k][l][t];}rep(k,0,1)rep(l,0,1)ans+=f[n][k][0][l];cout<<ans<<endl;return 0;
}
最长公共子序列【省选模拟赛】相关推荐
- 洛谷[LnOI2019]长脖子鹿省选模拟赛 简要题解
传送门 听说比赛的时候T4T4T4标程锅了??? WTF换我时间我要写T3啊 于是在T4T4T4调半天无果的情况下260pts260pts260pts收场真的是tcltcltcl. T1 快速多项式变 ...
- 长脖子鹿省选模拟赛 [LnOI2019SP]快速多项式变换(FPT)
本片题解设计两种解法 果然是签到题... 因为返回值问题T了好久... 第一眼:搜索大水题? 然后...竟然A了 1 #include<cstdio> 2 #include<queu ...
- [LnOI2019]长脖子鹿省选模拟赛 东京夏日相会
这里来一发需要开毒瘤优化,并且几率很小一遍过的模拟退火题解... 友情提醒:如果你很久很久没有过某一个点,您可以加上特判 可以像 P1337 [JSOI2004]平衡点 / 吊打XXX 那道题目一样 ...
- [luogu#2019/03/10模拟赛][LnOI2019]长脖子鹿省选模拟赛赛后总结
t1-快速多项式变换(FPT) 题解 看到这个\(f(x)=a_0+a_1x+a_2x^2+a_3x^3+ \cdots + a_nx^n\)式子,我们会想到我们学习进制转换中学到的,那么我们就只需要 ...
- 哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)---E---小乐乐匹配字符串(最长公共子序列)
链接:https://ac.nowcoder.com/acm/contest/301/E 来源:牛客网 小乐乐有字符串str1,str2. 小乐乐想要给他们找朋友. 小乐乐想知道在这两个字符串中最多能 ...
- 省选模拟赛记录(越往下越新哦~~~)
LOG 模拟赛 第一次见尼玛这么给数据范围的-- 开考有点困,迷迷糊糊看完了三道题,真的是像老吕说的那样,一道都不会-- 思考T1,感觉有点感觉,但是太困了,就先码了暴力,发现打表可以50分,于是就大 ...
- 助你深刻理解——最长公共子串、最长公共子序列(应该是全网数一数二的比较全面的总结了)
往事不堪回首,那些年处理过的字符串[的一些骚操作] 最长公共子串篇(20191120) 理论知识: 图形理解: 矩阵初始化: 矩阵数值演变: 类似算法: 代码实现(C++): 代码设计满足的要求: 测 ...
- 最长公共子序列动态规划c语言,动态规划----最长公共子序列(C++实现)
最长公共子序列 题目描述:给定两个字符串s1 s2 - sn和t1 t2 - tm .求出这两个字符串的最长公共子序列的长度.字符串s1 s2 - sn的子序列指可以表示为 - { i1 < i ...
- 漫画:最长公共子序列
题目: 给定两个字符串 str1 和 str2,返回这两个字符串的最长公共子序列的长度 解释:一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以 ...
- 最长公共子序列LCS
输入: str1 = "abcde", str2 = "ace" 输出: 3 解释: 最长公共子序列是 "ace",它的长度是 3 这里用0 ...
最新文章
- 实现线程哪种方法更好_实施数据以实现更好的用户体验设计的4种方法
- 关于Windows 7的64位系统不兼容某些控件的问题
- shell-1.shell注释
- Java网络编程-1
- 编译ffmpeg出现 librtmp not found using pkg-config
- 设置域用户帐户的登录时间
- zabbix 邮件报警 监控mysql主从
- QT实现操控打印机打印图片
- ubuntu系统各pdf编辑器的使用体验和比较
- 如何在 think-cell 瀑布图中并行汇总多个系列?
- 项目管理软件之禅道和JIRA的共同点与区别
- Html post易语言服务器,POST其实很简单 15 易语言模块之精易模块
- php utc 北京时间,美国各个时区转换成北京时间 utc gmt
- 影响力(罗伯特·西奥迪尼)读书笔记思维导图
- 最小圆覆盖问题 算法步骤与证明+代码模板
- UESTC论坛-清水河畔自动登陆/重复发贴/安全性分析
- 电脑电池出场容量与目前最大容量查询查询
- GetPrivateProfileString函数之新手上路
- 1271:圆柱体的表面积
- 关于Pi的kyc相关问题
热门文章
- 小鹏VPA停车场记忆泊车功能试驾体验和解读
- 【论文解读】CVPR 2021 妆容迁移 论文解读Spatially-invariant Style-codes Controlled Makeup Transfer
- 基于Extent 的文件存储(fiemap)
- 【ts】typescript高阶:键值类型及type与interface区别
- 华为防火墙基础自学系列 | Site to Site IPSec VdPdNd
- 数据库应用-后缀树及后缀数组(Suffix-BäumeSuffix-Arraz)-2
- 定时改变App主题的方案
- 谷歌浏览器下载地址及chromedriver下载地址
- mysql查询某一个字段是否包含中文汉字
- C#语言实例源码系列-实现批量更改文件名称大小写或扩展名