题目大意:先给定两个序列的长度,然后输出两个序列,求最长公共子序列
输入第一串序列时,hash记录第一串序列的每个元素的位置序号
输入第二串序列时,将第二串序列的每个元素赋上该元素的位置序号
然后该问题就转换成了求位置序号序列的最长上升子序列Perfect!!!
*********************************************************************************************************
#include <cstdio>
using namespace std;
const int maxn = 1e5 + 10;
const int INF = 1e6;
int a[maxn], hash_[maxn], dp[maxn];
int bin_find(int key, int l, int r)
{
while(l <= r)
{
int mid = (l+r)>>1;
if(key <= dp[mid]) r = mid - 1;
else l = mid + 1;
}
return r + 1;
}
int main()
{
int i;
int n, x;
scanf("%d", &n);
for(i = 1; i <= n; ++i)
{
scanf("%d", &x);
hash_[x] = i;
}
for(i = 1; i <= n; ++i)
{
scanf("%d", &x);
a[i] = hash_[x];
}
int len = 0;
dp[0] = -INF;
for(i = 1; i <= n; ++i)
{
if(a[i] > dp[len]) dp[++len] = a[i];
else
{
int pos = bin_find(a[i], 1, len);
dp[pos] = a[i];
}
}
printf("%d\n", len);
return 0;
}