朴素的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;
}