本题看起来像LCS,所以先提LCS的解法
最长公共子序列
发现最长公共子其实就是两个序列不同元素的LIS,然后就能在O(nlogn)的时间内求出长度
——————————————————————————
再
考
虑
本
题
,
发
现
是
一
样
的
性
质
,
所
以
套
用
上
面
的
做
法
再考虑本题,发现是一样的性质,所以套用上面的做法
再考虑本题,发现是一样的性质,所以套用上面的做法
需
要
注
意
的
是
本
题
输
出
方
式
为
C
a
s
e
需要注意的是本题输出方式为Case
需要注意的是本题输出方式为Case
#include<bits/stdc++.h>
using namespace std;
const int N=252;
int n;
int dp[N*N];
int id[N*N];
int find(int l,int r,int k){
while(l<r){
int mid=(l+r)>>1;
if(dp[mid]<k) l=mid+1;
else r=mid;
}
return l;
}
int main(){
int T;
scanf("%d",&T);
for(int t=1;t<=T;t++)
{
int p,q;
scanf("%d%d%d",&n,&p,&q);
memset(id,0,sizeof(id));
memset(dp,0,sizeof(dp));
for(int i=1;i<=p+1;i++){
int a;
scanf("%d",&a);
id[a]=i;
}
int b=0;int i,len=1;
for(i=1;i<=q+1;i++){
if(id[b]) break;
scanf("%d",&b);
}
dp[0]=0;
dp[1]=id[b];
for(;i<=q+1;i++){
scanf("%d",&b);
if(id[b]){
if(id[b]>dp[len]) dp[++len]=id[b];
else{
int idd=find(0,len,id[b]);
dp[idd]=id[b];
}
}
}
printf("Case %d: %d\n",t,len);
}
}