ab两个字符串,将a字符串重新编号为 则b字符串可根据a字符串编号
例如:
a={1,7,5,4,8,3,9}
b={1,4,3,5,6,2,8,9}
a编号为{1,2,3,4,5,6,7}
b重新编号为{1,4,6,3,0,0,5,7}
(第二个编号为4是因为原来b中的4在a中位置为4)
0表示在a中没有出现过
然后用nlogn复杂度的LIS解决
#include <iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=250*250+10;
int num[maxn],s[maxn],g[maxn];
int main()
{
int t,C=1;
scanf("%d",&t);
while(t--) {
int n,p,q,x;
memset(num,0,sizeof num);
scanf("%d%d%d",&n,&p,&q);
for(int i = 1; i <= p+1; ++i) {
scanf("%d",&x);
num[x] = i;
}
int o=0;
for(int i = 1; i <= q+1; ++i) {
scanf("%d",&x);
if(num[x])
s[o++] = num[x];
}
for(int i = 1; i <= o; ++i) {
g[i] = 0x3f3f3f3f;
}
int ans = -1;
for(int i = 0; i < o; ++i) {
int k=lower_bound(g,g+o,s[i])-g;
g[k] = s[i];
ans=max(ans,k);
}
printf("Case %d: %d\n",C++,ans);
}
return 0;
}