zoukankan      html  css  js  c++  java
  • 「模板」 最长公共子序列

    「模板」 最长公共子序列

    <题目链接>


    LCS通过一些神奇的操作转为LIS。

    然后通过二分查找实现n log n LIS。

    我写得有些麻烦,multimap这种玄学STL东西完全可以不用的。

    #include <algorithm>
    #include <cstdio>
    #include <map>
    using namespace std;
    const int MAXN=100010,MAXM=2600010;
    int n,m,ans,a[MAXN],b[MAXN],s[MAXM],f[MAXM];
    multimap<int,int> mmp;
    void Read(int *a)
    {
    	for(int i=1;i<=n;++i)
    		scanf("%d",&a[i]);
    }
    void DP(void)
    {
    	ans=1,f[1]=s[1];
    	for(int i=2;i<=m;++i)
    		if(f[ans]<s[i])
    			f[++ans]=s[i];
    		else
    			f[lower_bound(f+1,f+ans,s[i])-f]=s[i];
    	printf("%d
    ",ans);
    }
    int main(int argc,char *argv[])
    {
    	scanf("%d",&n);
    	Read(a),Read(b);
    	for(int i=1;i<=n;++i)
    		mmp.insert(make_pair(b[i],i));
    	for(int i=1;i<=n;++i)
    	{
    		multimap<int,int>::iterator k=mmp.upper_bound(a[i]);
    		if((--k)->first!=a[i])
    		{
    			s[++m]=0;
    			continue;
    		}
    		while(k->first==a[i])
    			s[++m]=(k--)->second;
    	}
    	DP();
    	return 0;
    }
    

    谢谢阅读。

  • 相关阅读:
    摆花
    关于我的博客
    博客美化更新日志
    页面美化代码1.x
    本人已转至新博客!
    回归博客园
    退役快乐
    Luogu神贴合辑
    代码高亮预览
    NOIp2018普及组初赛解题报告
  • 原文地址:https://www.cnblogs.com/Capella/p/8268191.html
Copyright © 2011-2022 走看看