思路:
转换一下就相当于一个最长公共子序列。
以前写过的:【模板】最长公共子序列
复杂度 O(nlogn)
注意:A中的数B中没有时要注意一下不能喝有的时候一起考虑。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 62500
#define inf (1<<30)
int k,n,m;
int a[maxn+5];
int b[maxn+5];
int wina[maxn+5];
int winb[maxn+5];
int f[maxn+5];
int main() {
int T;
scanf("%d",&T);
for(int t=1; t<=T; t++) {
memset(wina,0,sizeof(wina));
for(int i=1; i<=maxn; i++) f[i]=inf;
scanf("%d%d%d",&k,&n,&m);
k*=k,n++,m++;
for(int i=1; i<=n; i++) scanf("%d",&a[i]);
for(int i=1; i<=m; i++) scanf("%d",&b[i]);
for(int i=1; i<=n; i++) wina[a[i]]=i;
for(int i=1; i<=m; i++) winb[i]=wina[b[i]];
int longest=0;
f[0]=0;
for(int i=1; i<=m; i++)
if(b[i]) {
f[1]=b[i];
longest=1;
break;
}
for(int i=2; i<=m; i++) {
if(!b[i]) continue;
int j=lower_bound(f+1,f+k+1,winb[i])-f-1;
f[j+1]=min(f[j+1],winb[i]);
if(j>=longest) longest=j+1;
}
printf("Case %d: %d\n",t,longest);
}
return 0;
}