【SSL】勇闯黄金十二宫---射手宫

勇闯黄金十二宫—射手宫


Description

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

Input

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

Output

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

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])
{ t + + ; d [ t ] = a [ i ] ; t++;d[t]=a[i]; }
e l s e else
{ s u m = u p p e r 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]; }app

#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;
}