朴素的LCS是O(n2)的,考虑只有B[i]=A[j]时才会使答案+1,那么由于本题的特殊性质,对于某一个B[i],与之相等的A[j]只有5个,那么我们可以用
#include<iostream>
#include<cstdio>
#define N 100005
using namespace std;
int tree[N];
int a[N][6];
int f[N];
int n,ans;
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
return a*f;
}
int query(int x)
{
int tmp=0;
for (int i=x;i;i-=i&-i)
tmp=max(tmp,tree[i]);
return tmp;
}
void update(int x,int val)
{
for (int i=x;i<=n;i+=i&-i)
tree[i]=max(tree[i],val);
}
int main()
{
n=read()*5;
for (int i=1;i<=n;i++)
{
int x=read();
a[x][++a[x][0]]=i;
}
for (int i=1;i<=n;i++)
{
int x=read();
for (int j=5;j;j--)
{
int pos=a[x][j];
f[pos]=max(f[pos],query(pos-1)+1);
update(pos,f[pos]);
ans=max(ans,f[pos]);
}
}
cout << ans << endl;
return 0;
}