#include"iostream"
#include"stdio.h"
#include"vector"
#include"functional"
#include"string"
#include"cstring"
#include"algorithm"
#include"queue"
#include"set"
#define f1 cout<<"fuck1"<<endl;
#define f2 cout<<"fuck2"<<endl;
using namespace std;
typedef pair<int,int> pii;
typedef vector<int> vi;
const int INF=1000000;
const int maxn=100000;
int d[maxn],a2[maxn],num[maxn],g[maxn];
int main()
{
int t;
cin>>t;
int Case=1;
while(t--)
{
int n,p,q;
cin>>n>>p>>q;
memset(num,0,sizeof(num)); //0表示在第一个串中没有出现过这个元素
for(int i=1;i<=p+1;i++)
{
int a;
scanf("%d",&a);
num[a]=i; //给a这个值编号
}
int cnt=1;
for(int i=1;i<=q+1;i++)
{
int a;
scanf("%d",&a);
if(num[a]) a2[cnt++]=num[a];//若a这个值在之前那个串中出现过就把之前出现过的值的编号传给b,
}
cnt--; //指针回退一个
for(int i=1;i<=cnt;i++) g[i]=INF; //初始化
int ans=-1;
for(int i=1;i<=cnt;i++)
{
int k=lower_bound(g+1,g+q+1+1,a2[i])-g; //相同的d[i]但是找到下标最小的位置
d[i]=k;
g[k]=a2[i];
ans=max(ans,d[i]); //把lis最大值保存下来就就是lcs的结果
}
printf("Case %d: %d\n",Case++,ans);
}
return 0;
//*
}
UVA 10635 LIS
最新推荐文章于 2021-04-07 18:37:24 发布