「模板」 最长公共子序列
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;
}
谢谢阅读。