UVA - 10635 最长公共子序列

时间:2023-03-08 16:59:35
UVA - 10635 最长公共子序列

input

n,p,q 2<=n<=250 1<=p,q<=n*n

1 a1 a2 a3 ... ap  1<ai<n*n,ai!=aj

1 b1 b2 b3 ... bq  1<bi<n*n,bi!=bj

output

最长公共子序列个数

做法:将b数组中的数变为a数组中数的下标,a中不存在的数可以去掉,然后求LIS即可

#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
#define MAX 63000
#define LL long long
using namespace std;
int a[MAX],b,len[MAX],idx[MAX],bi[MAX],T,p,q,m,n,cas=;
int main()
{
freopen("/home/user/桌面/in","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&m,&p,&q);
scanf("%*d");
for(int i=;i<=p;i++)
{
scanf("%d",&a[i]);
idx[a[i]]=i;//当a[i]范围很大时可用hash代替
}
n=;
scanf("%*d");
for(int i=;i<q;i++)
{
scanf("%d",&b);
if(a[idx[b]]) bi[++n]=idx[b];
}
len[]=bi[];
int l=;
for(int i=;i<=n;i++)//求LIS
{
if(bi[i]>len[l]) len[++l]=bi[i];
else *lower_bound(len+,len+l+,bi[i])=bi[i];
}
printf("Case %d: %d\n",cas++,l+);
}
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return ;
}