题目描述 传送门
求两序列的LCS,当序列元素两两互不相等可转化为LIS。
LIS可以用
O(nlogn)
的算法求解。
(但我还是理解不透彻,总感觉在背模板…)
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=70000;
int a[maxn],b[maxn],c[maxn],d[maxn],g[maxn];
int main(){
int t,kase=0;
cin>>t;
while(t--){
int n,p,q;
scanf("%d%d%d",&n,&p,&q);
memset(c,0,sizeof(c));
for(int i=1;i<=p+1;i++){
scanf("%d",&a[i]);
c[a[i]]=i;
}
for(int i=1;i<=q+1;i++){
scanf("%d",&b[i]);
b[i]=c[b[i]];
}
for(int i=1;i<=q+1;i++) g[i]=1e9;
g[0]=0;
d[0]=0;
for(int i=1;i<=q+1;i++){
int k=lower_bound(g,g+q+2,b[i])-g;
d[i]=k;
g[k]=b[i];
}
printf("Case %d: %d\n",++kase,d[q+1]);
}
return 0;
}