博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P3402 最长公共子序列(nlogn)
阅读量:6839 次
发布时间:2019-06-26

本文共 1498 字,大约阅读时间需要 4 分钟。

这里写图片描述
先看一下数据规模:n<=300000,n^2的做法肯定就要挂掉了,所以用到了这个nlogn的做法。
先介绍一下nlogn的做法:
最长公共子序列 的 nlogn 的算法本质是 将该问题转化成 最长增序列(LIS),因为 LIS 可以用nlogn实现,所以求LCS的时间复杂度降低为 nlogn。
转化:将LCS问题转化成LIS问题。
假设有两个序列 s1[ 1~6 ] = { a, b, c , a, d, c }, s2[ 1~7 ] = { c, a, b, e, d, a, b }。
记录s1中每个元素在s2中出现的位置, 再将位置按降序排列, 则上面的例子可表示为:
loc( a)= { 6, 2 }, loc( b ) = { 7, 3 }, loc( c ) = { 1 }, loc( d ) = { 5 }。
将s1中每个元素在s2中的位置按s1中元素的顺序排列成一个序列s3 = { 6, 2, 7, 3, 1, 6, 2, 5, 1 }。
在对s3求LIS得到的值即为求LCS的答案。
证明略。

再观察数据,ai<=10^9,那普通的数组肯定就不行了。然后再看一下题目,每个元素不会重复。所以就产生了两种处理方法:哈希 or map(当然大佬会选择省时的哈希,我就只能去用map了)。

还要注意一个问题,在对应中,出现位置是0的直接跳过,因为这是没有对应的,肯定不是共有的元素啦。

#include
#include
#include
#include
#include
#include
#include
using namespace std;map
ma; int n,m;int s1[300009],s2[300009];int a[300009],low[300009],len;int find(int l,int r,int z){ int mid; while(l<=r) { int mid=(l+r)>>1; if(low[mid]<=z) l=mid+1; else r=mid-1; } return l;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&s1[i]); for(int i=1;i<=m;i++) scanf("%d",&s2[i]); for(int i=1;i<=m;i++) ma[s2[i]]=i; for(int i=1;i<=n;i++) a[i]=ma[s1[i]]; int t=1; while(a[t]==0) t++; low[++len]=a[t]; for(int i=2;i<=n;i++) { if(a[i]==0) continue; if(a[i]>low[len]) low[++len]=a[i]; else { //low[upper_bound(low+1,low+len+1,a[i])-low]=a[i];//自带函数 low[find(1,len,a[i])]=a[i];//正确的二分 } } printf("%d",len); return 0; }

转载于:https://www.cnblogs.com/dfsac/p/7587921.html

你可能感兴趣的文章
C#绘制三角形并填充,使用winform实现qq聊天气泡
查看>>
(转)在Eclipse中用TODO标签管理任务(Task)
查看>>
17秋 软件工程 团队第五次作业 Alpha Scrum5
查看>>
图数据库Neo4j简介
查看>>
linux使用ip能ping通,但使用域名却不能访问的解决方法
查看>>
3.SOAP和WSDL的一些必要知识
查看>>
SQL语句统计每天、每月、每年的数据
查看>>
使用maven创建工程报错Could not resolve archetype org.apache.maven.archetype
查看>>
PHP Manager 安装失败的解决方法, PHP Manager 1.4 for IIS 10,经验证支持windows server 2016版本...
查看>>
19. Spring Boot Shiro 权限管理
查看>>
Centos6.9下RabbitMQ集群部署记录
查看>>
A session had already been started – ignoring session_start() 怎么办?
查看>>
getImplementationVersion-获取版本号
查看>>
MongoDB server side Javascript 如何直接传入字符串?
查看>>
lvs,nginx,haproxy的优缺点,适合场景
查看>>
Linux时间子系统(十三) Tick Device layer综述
查看>>
分享:Android系统的经常使用权限整理
查看>>
mysql数据库性能测试报告
查看>>
CentOS 7 安装配置 MySQL
查看>>
一个可变布局列表,有9种布局item大小,每个item可拖拽切换位置
查看>>