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=1; 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=1;i<=p;i++) { scanf("%d",&a[i]); idx[a[i]]=i;//当a[i]范围很大时可用hash代替 } n=0; scanf("%*d"); for(int i=0;i<q;i++) { scanf("%d",&b); if(a[idx[b]]) bi[++n]=idx[b]; } len[1]=bi[1]; int l=1; for(int i=1;i<=n;i++)//求LIS { if(bi[i]>len[l]) len[++l]=bi[i]; else *lower_bound(len+1,len+l+1,bi[i])=bi[i]; } printf("Case %d: %d\n",cas++,l+1); } //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC); return 0; }
时间: 2024-11-07 05:55:58