「模板」 最长公共子序列

「模板」 最长公共子序列

<题目链接>


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;
}

谢谢阅读。

原文地址:https://www.cnblogs.com/Capella/p/8268191.html