题意:给你k,n,m三个数。再给你两个序列,长度分别为n+1和m+1,k没啥用,求两个序列的最长公共子序列。
思路:O(n^2)会超时,于是转化为O(nlogn)的最长上升子序列。
代码:
#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200010;
const int mo=1e9+7;
int f[maxn];
map<int,int>mp;
int search(int l,int r,int x)
{
while(l<r)
{
int mid=(l+r)>>1;
if(x<=f[mid]) r=mid;
else l=mid+1;
}
return l;
}
int main()
{
int T,cas;
scanf("%d",&T);
for(int cas=1;cas<=T;cas++)
{
int nn;
scanf("%d",&nn);
int n,m;
scanf("%d %d",&n,&m);
n++;m++;
for(int x,i=1;i<=n;i++)
{
scanf("%d",&x);
mp[x]=i;
}
int len=0;
for(int a,x,i=1;i<=m;i++)
{
scanf("%d",&a);
x=mp[a];
if(!x) continue;
if(x>f[len]) f[++len]=x;
else
{
int p=search(1,len,x);
f[p]=x;
}
}
printf("Case %d: %d\n",cas,len);
}
return 0;
}