题意:求最长公共子序列,这题涉及到将LCS转化为LIS,不然会超时,用LIS的o(nlogn)的算法,很容易理解:记录A序列的下标,然后依次填写在B序列对应的数中,然后求LIS
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 70000;
const int INF = 1<<30;
int g[MAXN];
int m[MAXN];
int d[MAXN],G[MAXN];
int main(){
int t;
scanf("%d",&t);
for(int cas = 1; cas <= t; cas++){
int n,q,p;
scanf("%d%d%d",&n,&p,&q);
memset(g,0,sizeof(g));
int a;
for(int i = 1; i <= p+1; i++){
scanf("%d",&a);
g[a]=i;
}
int len=0;
for(int i = 1; i <= q + 1 ;i++){
scanf("%d",&a);
if(g[a])
m[len++]=g[a];
}
int ans=0;
for(int i = 0; i <= len; i++) G[i]=INF;
for(int i = 0; i < len ; i++)
{
int k=lower_bound(G,G+len,m[i])-G;
d[i]=k+1;
G[k]=m[i];
ans=max(d[i],ans);
}
printf("Case %d: %d\n",cas,ans);
}
return 0;
}