题目:
题目描述
给出 1 \sim n1∼n 的两个排列 P_1P1 和 P_2P2,求它们的最长公共子序列。
和最长公共子序列(LCS)(1)问题不同的是,本题的 nn 在 5 \sim 1000005∼100000 之间。
输入
第一行是一个数 nn ;(nn 是 5 \sim 1000005∼100000 之间的整数)
接下来两行,每行为 nn 个数,为自然数 1 \sim n1∼n 的一个排列(1 \sim n1∼n 的排列每行的数据都是 1 \sim n1∼n 之间的数,但顺序可能不同,比如 1 \sim 51∼5 的排列可以是:11 22 33 44 55,也可以是 22 55 44 33 11)。
输出
一个整数,即最长公共子序列的长度。
输入:
5
3 2 1 4 5
1 2 3 4 5
输出:
3
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N = 100100;
int a[N], b[N], c[N], dp[N];
int n;
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
c[a[i]] = i;
}
for (int i = 1; i <= n; i++)
scanf("%d", &b[i]);
dp[1] = c[b[1]];
int len = 1;
int l, r, mid;
for (int i = 2; i <= n; i++)
{
if (c[b[i]] > dp[len])
{
len++;
dp[len] = c[b[i]];
}
else {
l = 1;
r = len;
while (l <= r)
{
mid = l + r >> 1;
if (c[b[i]] <= dp[mid])
r = mid - 1;
else l = mid + 1;
}
dp[l] = c[b[i]];
}
}
cout << len;
}