/*
*为了用set写被折磨了好久,其实没多大事,不了解set建议百度一下
要解决本题要两步:
         第一步: 计算两数组自身去重分别需要操作多少次
         第二步: 计算自身去重后,消除两数组的重合部分需要操作多少次
         对于第二步,若自身去重后,两数组无重合,直接取两数组操作次数中的大的那一个。
         否则,需要根据第一步两个数组操作次数大小进行讨论,
*/
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
    int n;
    cin>>n;
    vector <int> a(n+1,0),b(n+1,0);
    set <int> p1,p2,p;//用set自带的去重功能,方便求重复的数字个数
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        p1.insert(a[i]);//p1表示第一组去重后的集合
    }
    for(int i=1;i<=n;i++)
    {
        cin>>b[i];
        p2.insert(b[i]);//p2表示第二组去重后的集合
    }
    int ans1 = n-p1.size();//ans1记录第一组中重复的数的总数
    int ans2 = n-p2.size();//ans2记录第二组中重复的数的总数
    for(auto i:p1)
    {
        p.insert(i);//p表示(p1 U p2)的集合
    }
    for(auto j:p2)
    {
        p.insert(j);
    }
    if(p1.size()+p2.size()==p.size())// p1 + p2 = p1 U p2说明集合无交集,不用后进行下一步,
    {
        cout<<max(ans1,ans2);
        return 0;
    }
    int num=p1.size()+p2.size()-p.size();//p1 ∩ p2 = p1 + p2 - (p1 U p2) 重合个数(单求自身去重两数组最小操作次数=(重合个数+1)/2)
    if(ans1==ans2)//第一步操作次数相同
    cout<<ans1+(num+1)/2;   //(num+1)是因为重合个数有奇数
    else if(ans1>ans2)
    {
        if(num+ans2<=ans1)//若重合个数(大于最小操作次数)加上ans2还是小于等于ans1,就取ans1
            cout<<ans1;
        else{//若有多余,还需要的最小操作次数=(多的个数+1)/2
            num=num+ans2-ans1;
            cout<<ans1+(num+1)/2;
        }
    }
    else{
       if(num+ans1<=ans2)
            cout<<ans2;
        else{
            num=num+ans1-ans2;
            cout<<ans2+(num+1)/2;
        }
    }
}