题目

给定两个字符串\(s1,s2\),求它们的\(LCS\)

满足\(|s1|\leq 10^6,|s2|\leq 10^3\)


分析

考场写了\(O(|s1|*|s2|)\)成功TLE,

考虑突破口为\(|s2|\)不够大,考虑转为判定,

设\(dp[i][j]\)表示原来存在最小的\(k\)使得\(f[k][i]\geq j\),不存在为\(n+1\)

那么\(dp[i][j]=\min\{dp[i-1][j],nxt[dp[i-1][j-1]][s2[i]]\}\),

然后二分\(dp[m][ans]\)即可,\(nxt\)数组要预处理,其实就是子序列自动机

转为判定是真的妙


代码

#include <cstdio>
#include <cstring>
#define rr register
using namespace std;
const int N = 1011, M = 1000011;
char s1[M], s2[N];
int dp[N][N], nxt[M][26], ls[26], n, m;
inline signed min(int a, int b) { return a < b ? a : b; }
signed main() {
freopen("lcs.in", "r", stdin);
freopen("lcs.out", "w", stdout);
scanf("%s%s", s1 + 1, s2 + 1), memset(dp, 42, sizeof(dp));
n = strlen(s1 + 1), m = strlen(s2 + 1);
memset(ls, 42, sizeof(ls));
for (rr int i = 0; i <= m; ++i) dp[i][0] = 0;
for (rr int i = n; i >= 0; --i) {
for (rr int j = 0; j < 26; ++j) nxt[i][j] = ls[j];
if (i > 0)
ls[s1[i] - 97] = i;
}
for (rr int i = 1; i <= m; ++i)
for (rr int j = 1; j <= i; ++j) {
dp[i][j] = dp[i - 1][j];
if (dp[i - 1][j - 1] <= n)
dp[i][j] = min(dp[i][j], nxt[dp[i - 1][j - 1]][s2[i] - 97]);
}
rr int l = 0, r = m;
while (l < r) {
rr int mid = (l + r + 1) >> 1;
if (dp[m][mid] <= n)
l = mid;
else
r = mid - 1;
}
return !printf("%d", l);
}

#dp#C 公共子序列的更多相关文章

  1. HDU 1159 Common Subsequence --- DP入门之最长公共子序列

    题目链接 基础的最长公共子序列 #include <bits/stdc++.h> using namespace std; ; char c[maxn],d[maxn]; int dp[m ...

  2. DP:LCS(最长公共子串、最长公共子序列)

    1. 两者区别 约定:在本文中用 LCStr 表示最长公共子串(Longest Common Substring),LCSeq 表示最长公共子序列(Longest Common Subsequence ...

  3. poj1458 求最长公共子序列 经典DP

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45763   Accepted: 18 ...

  4. LCS最长公共子序列~dp学习~4

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 Palindrome Time Limit: 4000/2000 MS (Java/Others ...

  5. 基于DP的LCS(最长公共子序列)问题

    最长公共子序列,即给出两个序列,给出最长的公共序列,例如: 序列1 understand 序列2 underground 最长公共序列undernd,长度为7 一般这类问题很适合使用动态规划,其动态规 ...

  6. [HAOI2010]最长公共子序列(LCS+dp计数)

    字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X ...

  7. POJ 1458 最长公共子序列(dp)

    POJ 1458 最长公共子序列 题目大意:给出两个字符串,求出这样的一 个最长的公共子序列的长度:子序列 中的每个字符都能在两个原串中找到, 而且每个字符的先后顺序和原串中的 先后顺序一致. Sam ...

  8. 最长公共子序列与最长公共字串 (dp)转载http://blog.csdn.net/u012102306/article/details/53184446

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  9. hdu1159 dp(最长公共子序列)

    题意:给两个字符串,求这两个字符串的最长公共子序列的长度 因为之前集训的时候做过,所以现在即使会做也并不是什么稀奇的事,依旧为了自己的浅薄感到羞愧啊``` 解法就是通过两个字符串的每个字符互相比较,根 ...

  10. POJ-1458.CommonSubsequence.(DP:最长公共子序列裸题)

    本题大意:给出两个字符串,让你求出最长公共子序列的长度并输出. 本题思路:本题是经典的DP问题,由于是两个字符串,那么我们就用一个二维数组来进行区分,用dp[ i ][ j ]来表示在s1和s2中分别 ...

随机推荐

  1. day02---虚拟机上网模式

    修改虚拟网络编辑器 虚拟软件网络模式介绍 NAT网络模式 特点:虚拟主机和宿主机网络信息 可以不一致 优点:不容易出现局域网中IP地址冲突 缺点:其它宿主机不能直接访问虚拟机 桥接网络模式 特点:虚拟 ...

  2. 大众点评cat报警源码

    类时序 时许说明 判断是否是报警机器. 1分钟启动一个线程根据设置的报警条件,时间段去查询CAT报告数据. 根据返回的报告数据,逐层解析TYPE,NAME,RANGE中的数据是否满足报警条件. 只有全 ...

  3. 【Azure 存储服务】使用PowerShell脚本创建存储账号(Storage Account)的共享访问签名(SASToken) : New-AzStorageContainerSASToken

    问题描述 使用PowerShell脚本如何来创建存储账号(Storage Account)的共享访问签名呢?查询到可以使用 New-AzStorageContainerSASToken 命令来生成Az ...

  4. 亲测可用,ChatGPT 对话技巧

      "Linux终端" "我希望你充当一个 linux 终端.我会输入命令,你会回复终端应该显示的内容.我希望你只回复一个唯一代码块内的终端输出,没有别的.不要写解释.除 ...

  5. [逆向] PE文件学习

    目录 概述 MS-DOS 头部 IMAGE_DOS_HEADER PE头 IMAGE_NT_HEADER IMAGE_FILE_HEADER IMAGE_OPTIONAL_HEADER32 数据目录列 ...

  6. 内存缓存 Gcache VS Caffeine源码详解

    转一篇.后续再尝试自己实践一下

  7. nginx四层和七层负载的配置

    四层负载和七层负载是两种不同类型的负载均衡策略,它们分别在网络的不同层次上工作.在Nginx中,这两种负载均衡策略可以通过配置nginx.conf文件来实现. 四层负载(L4 Load Balanci ...

  8. SpringMVC异常之The request sent by the client was syntactically incorrect解决方案

    最近在做SpringMVC开发的时候,直接访问后台的controller,出现如下异常 这个问题是什么原因造成的呢? 后来经过测试发现,是表单提交的内容数据类型与实体的(也就是数据表字段)的数据类型不 ...

  9. window.showModalDialog与opener及returnValue

    首先来看看 window.showModalDialog 的参数 vReturnValue = window.showModalDialog(sURL [, vArguments] [, sFeatu ...

  10. 记一次由虚假唤醒产生的bug

    记一次由虚假唤醒产生的bug 用int a代表产品数量最少0最多10,有两个生产者,三个消费者,用多线程和条件变量模拟生产消费过程: #include <sys/types.h> #inc ...