【题目描述】
X国现在在与y国交战,x国有n个炮兵部队,y国有n个步兵部队。x国的司令想让炮兵部队用大炮轰y国的步兵部队。每个炮兵部队只能轰与这个部队编号相同的步兵部队。由于炮弹的轨道交叉很危险,所以司令不想让炮弹的轨道交叉。
【输入格式】
第1行一个数:n;
第2行n个数:x国炮兵部队的编号。
第3行n个数:y国步兵部队的编号。
【输出格式】
一个数:最多能轰到的步兵部队的数量。
【样例输入】
5
3 1 5 8 6
1 5 7 3 6
【样例输出】
3
【样例解释】
2号炮兵部队轰1号步兵部队;
3号炮兵部队轰2号步兵部队;
5号炮兵部队轰5号步兵部队;
【数据范围】
对于20%的数据:1≤n≤10;
对于60%的数据:1≤n≤5000;
对于80%的数据:所有炮兵部队的编号都不相同;所有步兵部队的编号都不相同;
对于100%的数据:1≤n≤100000;所有的部队编号≤n;
代码
include<bits/stdc++.h>
using namespace std;
int n;
int x[100001],y[100001],f[100001],d[100001];
int main()
{
freopen("war.in","r",stdin);
freopen("war.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&x[i]);
for(int i=1;i<=n;i++)
scanf("%d",&y[i]);
for(int i=1;i<=n;i++)
d[x[i]]=i;
for(int i=1;i<=n;i++)
{
f[i]=max(f[i],f[i-1]);
if(i>=d[x[i]])
f[i]=max(f[i],f[d[x[i]]]+1);
else
f[d[x[i]]]=max(f[i]+1,f[d[x[i]]]);
}
printf("%d
",f[n]);
}