勇闯黄金十二宫—射手宫


Description

第九个他们来到射手宫,身为射手座黄金圣斗士的艾尔里斯是狮子座圣斗士艾尔里亚的哥哥,他早在13年前就发现了撒加杀了真教皇,并且自己做了假教皇。然而他却被撒加***致死。现在星矢四人已经来到了射手宫。艾尔里斯的灵魂想考验一下这些圣斗士们的水平,在射手宫的墙上留下了一道题目。 “已知艾尔里斯和弟弟艾尔里亚的基因基本相同,由于基因表达起来不方便,所以就用n个数字来表示。(因为至今共发现100000种基因,所以每个数字都<=100000)兄弟之间的基因个数是相同的,就是说他们都有n个数字。且对于每个人,这n个数字互不相同。现在要求兄弟之间基因的最长公共部分。可以不连续。” 如果,他们解决不了这题,就通不过射手宫了。不过还好,他们顺利地通过了!

Input

本题包含多组数据. 第1行,为n(1<=n<=100000) 下面2行,每行n个数字,表示了一个人的所以基因。

Output

对于每组数据输出一行,为他们两人基因的最长公共部分。

Sample Input

7
1 2 3 4 5 6 7
7 6 5 4 1 2 3

Sample Output

3

解题思路

先将输入的每个数出现的位置记下,然后找出所有重复的数,最后求出最长不下降序列。
动态转移方程式:
i f ( a [ i ] > d [ t ] ) if(a[i]>d[t]) if(a[i]>d[t])
{ t + + ; d [ t ] = a [ i ] ; t++;d[t]=a[i]; t++;d[t]=a[i];}
e l s e else else
{ s u m = u p p e r sum=upper sum=upper_ b o u n d ( d + 1 , d + t + 1 , a [ i ] ) − d ; d [ s u m ] = a [ i ] ; bound(d+1,d+t+1,a[i])-d;d[sum]=a[i]; bound(d+1,d+t+1,a[i])d;d[sum]=a[i];}

#include<iostream>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int n,a[100010],b[100010],d[100010],k,s=0,t=1,sum;
int main()
{
   
	cin>>n;
	for(int i=1;i<=n;i++)
	{
   
		scanf("%d",&k);
		b[k]=i;//记录下每个数出现的位置
	}
	for(int j=1;j<=n;j++)
	{
   
		scanf("%d",&k);
		if(b[k]!=0)
		{
   
			s++;
			a[s]=b[k];//找出所有重复的数
		}
	}
	d[1]=a[1];
	for(int i=1;i<=s;i++)
	{
   
		if(a[i]>d[t])
		{
   
			t++;
			d[t]=a[i];//如果a[i]大于d[t],将a[i]放在数列的最前面
		}
		else
		{
   
			sum=upper_bound(d+1,d+t+1,a[i])-d;//二分查找
			d[sum]=a[i];
		}
	}
	cout<<t;
	return 0;
}