题目描述
给出 1,2,…,�1,2,…,n 的两个排列 �1P1 和 �2P2 ,求它们的最长公共子序列。
输入格式
第一行是一个数 �n。
接下来两行,每行为 �n 个数,为自然数 1,2,…,�1,2,…,n 的一个排列。
输出格式
一个数,即最长公共子序列的长度。
输入输出样例
输入 #1复制
5 3 2 1 4 5 1 2 3 4 5
输出 #1复制
3
说明/提示
- 对于 50%50% 的数据, �≤103n≤103;
- 对于 100%100% 的数据, �≤105n≤105。
#include<bits/stdc++.h>
using namespace std;
int map[100005],dp[100005],a[100005];
int main()
{
int n,m,len;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&x);
map[x]=i;
}
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]=map[a[i]];
}
len=1;
dp[1]=a[1];
for (int i=2;i<=n;i++)
{
if(dp[len]<a[i])dp[++len]=a[i];
else
{
int l=1,r=len,mid;
while (l!=r)
{
mid=l+r>>1;
if(dp[mid]>a[i])r=mid;
else l=mid+1;
}
dp[l]=a[i];
}
}
printf("%d",len);
return 0;
}