Prince and Princess
题意:给出两行各不相同的数字,求最长公共子序列。
思路:O(p*q)的求法可能超时,因为数字各不相同,我们可以把第一组数字的下标存下来,然后第二组保存数字对应在第一组的下标,最后转换成求最长上升子序列即可。
#include<bits/stdc++.h>
using namespace std;
int p[70000],q[70000];
int id[70005],iid[70000];
int a[70000];
int main(){
ios::sync_with_stdio(false);
int T;
cin>>T;
int ca=1;
while(T--){
memset(id,-1,sizeof(id));
int n,q,p;
cin>>n>>p>>q;
int t;
for(int i=1;i<=p+1;i++){
cin>>t;
id[t]=i;
}
for(int i=1;i<=q+1;i++){
cin>>t;
iid[i]=id[t];
}
int l=0;
int ans=0;
for(int i=1;i<=q+1;i++){
if(iid[i]==-1)
continue;
int pos=lower_bound(a,a+l,iid[i])-a;
l=max(l,pos+1);
a[pos]=iid[i];
}
printf("Case %d: %d\n",ca++,l);
}
}