题目描述
给出1-n的两个排列P1和P2,求它们的最长公共子序列。
输入格式
第一行是一个数n,
接下来两行,每行为n个数,为自然数1-n的一个排列。
输出格式
一个数,即最长公共子序列的长度
输入输出样例
输入 #1复制
5
3 2 1 4 5
1 2 3 4 5
输出 #1复制
3
说明/提示
【数据规模】
对于50%的数据,n≤1000
对于100%的数据,n≤100000
比较明显,我们需要一个nlogn的做法。
我们想一下,是不是我们把数字等价替换之后,原来的LCS不会改变,这个很明显。
那不是我们把原序列等价替换为 1,2,3,4,5…之后,不就变成求LIS了吗?
直接手速一波。
AC代码:
#pragma GCC optimize(2)
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int n,a[N],b[N],cnt;
signed main(){
cin>>n;
for(int i=1,x;i<=n;i++) cin>>x,a[x]=i;
for(int i=1;i<=n;i++) cin>>b[i],b[i]=a[b[i]];
for(int i=1;i<=n;i++){
if(b[i]>a[cnt]) a[++cnt]=b[i];
else a[upper_bound(a+1,a+1+cnt,b[i])-a]=b[i];
}
cout<<cnt<<endl;
return 0;
}