stablegradients/pie-gem5-pairs huggingface dataset:
// Slower C++ solution:
#include <set>

#include <map>

#include <queue>

#include <ctime>

#include <cmath>

#include <cstdio>

#include <vector>

#include <string>

#include <cctype>

#include <bitset>

#include <cstring>

#include <cstdlib>

#include <utility>

#include <iostream>

#include <algorithm>

#define REP(i,a,b) for(int i=(a);i<=(b);i++)

#define PER(i,a,b) for(int i=(a);i>=(b);i--)

#define RVC(i,S) for(int i=0;i<(S).size();i++)

#define RAL(i,u) for(int i=fr[u];i!=-1;i=e[i].next)

using namespace std;

typedef long long LL;

typedef pair<int,int> pii;

     

template<class T> inline

void read(T& num) {

    bool start=false,neg=false;

    char c;

    num=0;

    while((c=getchar())!=EOF) {

        if(c=='-') start=neg=true;

        else if(c>='0' && c<='9') {

            start=true;

            num=num*10+c-'0';

        } else if(start) break;

    }

    if(neg) num=-num;

}

/*============ Header Template ============*/

 

const int maxn=(int)(1e5)+5;

int cnt[maxn],now[2];

 

int main() {

    int n;

    read(n);

    REP(i,1,n) {

        int x;

        read(x);

        cnt[x]++;

    }

    int mx=(int)(1e5);

    REP(i,1,mx) if(cnt[i]) {

        if(cnt[i]&1) now[1]++;

        else now[0]++;

    }

    if(now[0]&1) now[1]--;

    printf("%d\n",now[1]+now[0]);

    return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.3763784079639856x):
#include<iostream>

#include<string.h>

#include<algorithm>

#include<map>

#include<stdio.h>

using namespace std;

int main() {

	int tmp;

	int n;

	scanf("%d", &n);

		map<int, int> a;

		for (int i = 1; i <= n; i++) {

			scanf("%d", &tmp);

			a[tmp]++;

		}

		int k = a.size();

		if (k % 2 == 1)printf("%d\n", k);

		else printf("%d\n", k - 1);



	return 0;

}
// Slower C++ solution:
#include <iostream>

#include <cstdio>

#include <algorithm>

using namespace std;



int barrel[200000];



int main() {

    int n;

    cin >> n;

    int t;

    for(int i = 0; i < n ;i++) {

        scanf("%d", &t);

        barrel[t]++;

    }

    int cnt = 0;

    for(int i = 0; i < 200000; i++) {

        if(barrel[i] > 1) {

            cnt += barrel[i] - 1;

        }

    }

    if(cnt % 2 == 1) {

        cnt++;

    }

    cout << n-cnt << endl;

}


// Faster C++ solution for the same problem (measured speedup: 1.7884840534484263x):
#include<iostream>

#include<string.h>

#include<algorithm>

#include<map>

#include<stdio.h>

using namespace std;

int main() {

	int tmp;

	int n;

	scanf("%d", &n);

		map<int, int> a;

		for (int i = 1; i <= n; i++) {

			scanf("%d", &tmp);

			a[tmp]++;

		}

		int k = a.size();

		if (k % 2 == 1)printf("%d\n", k);

		else printf("%d\n", k - 1);



	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



using VS = vector<string>;    using LL = long long;

using VI = vector<int>;       using VVI = vector<VI>;

using PII = pair<int, int>;   using PLL = pair<LL, LL>;

using VL = vector<LL>;        using VVL = vector<VL>;



#define ALL(a)  begin((a)),end((a))

#define RALL(a) (a).rbegin(), (a).rend()

#define PB push_back

#define EB emplace_back

#define MP make_pair

#define SZ(a) int((a).size())

#define SORT(c) sort(ALL((c)))

#define RSORT(c) sort(RALL((c)))

#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))

#define FOR(i, s, e) for (int(i) = (s); (i) < (e); (i)++)

#define FORR(i, s, e) for (int(i) = (s); (i) > (e); (i)--)

#define debug(x) cerr << #x << ": " << x << endl

const int INF = 1e9;                          const LL LINF = 1e16;

const LL MOD = 1000000007;                    const double PI = acos(-1.0);

int DX[8] = { 0, 0, 1, -1, 1, 1, -1, -1 };    int DY[8] = { 1, -1, 0, 0, 1, -1, 1, -1 };



/* -----  2018/02/23  Problem: 068_arc_b / Link: https://arc068.contest.atcoder.jp/tasks/arc068_b?lang=en  ----- */

/* ------問題------



すぬけくんはカードゲームで遊ぶことにしました。 N 枚からなるカードの山があり、上から i 枚目のカードには整数 Ai が書かれています。

すぬけくんはこのカードの山に対し 0 回以上、以下の操作を行い、残ったカードに書かれた値が互いに異なるようにしたいです。最大で何枚のカードを残すことが可能か求めなさい。なお、N は奇数であり、少なくとも 1 枚のカードを残すことが可能であることが保証されます。

操作：カードの山から任意の 3 枚のカードを抜き出す。抜き出したカードのうち書かれた値が最大であるようなカード 1 枚と最小であるようなカード 1 枚の合計 2 枚を選んで食べる。その後残った 1 枚をカードの山に戻す。



-----問題ここまで----- */

/* -----解説等-----



数字をまとめて個数で考える。

3個以上のものは同じものだけを選択することで全部1か2になる。

2についてこれらは全て選択し他の2あるいは1も選択する。

2が偶数個あるときは数自体を減らさずに個数のみを減らせる。

奇数個のときは最後の1つだけが相手が見つからず誰かを消すことになる。

これを書けば良い。



----解説ここまで---- */



LL N;



LL ans = 0LL;



int main() {

	cin.tie(0);

	ios_base::sync_with_stdio(false);



	cin >> N;

	VI a(N);

	VI cnt(100005);

	FOR(i, 0, N) {

		cin >> a[i];

		cnt[a[i]]++;

	}

	VI pq;

	FOR(i, 0, 100005) {

		if (cnt[i])pq.push_back(cnt[i]);



	}

	int even = 0;

	FOR(i, 0, SZ(pq)) {

		if (pq[i] % 2 == 0)even++;

	}

	ans = SZ(pq);

	if (even % 2 == 1)ans--;

	cout << ans << "\n";



	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.5044406828564034x):
#include <bits/stdc++.h>

using namespace std;

#define     SZ  50500

#define     LIM 2500005

#define     pii pair<int, int>

#define     pb  push_back

#define     ff  first

#define     ss  second





int main()

{

    //freopen("in.txt", "r", stdin);

    //freopen("out.txt", "w", stdout);

    ios_base::sync_with_stdio(false);

    cin.tie(NULL);

    int i, j, k;

    int n; cin>>n;

    int x;

    set<int> st;

    for (i = 0; i < n; i++)

    {

        cin>>x;

        st.insert(x);

    }

    int sz = st.size();



    if (sz % 2 == 0) cout<<(sz-1)<<"\n";

    else cout<<sz<<"\n";

    return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



using VS = vector<string>;    using LL = long long;

using VI = vector<int>;       using VVI = vector<VI>;

using PII = pair<int, int>;   using PLL = pair<LL, LL>;

using VL = vector<LL>;        using VVL = vector<VL>;



#define ALL(a)  begin((a)),end((a))

#define RALL(a) (a).rbegin(), (a).rend()

#define PB push_back

#define EB emplace_back

#define MP make_pair

#define SZ(a) int((a).size())

#define SORT(c) sort(ALL((c)))

#define RSORT(c) sort(RALL((c)))

#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))

#define FOR(i, s, e) for (int(i) = (s); (i) < (e); (i)++)

#define FORR(i, s, e) for (int(i) = (s); (i) > (e); (i)--)

#define debug(x) cerr << #x << ": " << x << endl

const int INF = 1e9;                          const LL LINF = 1e16;

const LL MOD = 1000000007;                    const double PI = acos(-1.0);

int DX[8] = { 0, 0, 1, -1, 1, 1, -1, -1 };    int DY[8] = { 1, -1, 0, 0, 1, -1, 1, -1 };



/* -----  2018/02/23  Problem: 068_arc_b / Link: https://arc068.contest.atcoder.jp/tasks/arc068_b?lang=en  ----- */

/* ------問題------



すぬけくんはカードゲームで遊ぶことにしました。 N 枚からなるカードの山があり、上から i 枚目のカードには整数 Ai が書かれています。

すぬけくんはこのカードの山に対し 0 回以上、以下の操作を行い、残ったカードに書かれた値が互いに異なるようにしたいです。最大で何枚のカードを残すことが可能か求めなさい。なお、N は奇数であり、少なくとも 1 枚のカードを残すことが可能であることが保証されます。

操作：カードの山から任意の 3 枚のカードを抜き出す。抜き出したカードのうち書かれた値が最大であるようなカード 1 枚と最小であるようなカード 1 枚の合計 2 枚を選んで食べる。その後残った 1 枚をカードの山に戻す。



-----問題ここまで----- */

/* -----解説等-----



数字をまとめて個数で考える。

3個以上のものは同じものだけを選択することで全部1か2になる。

2についてこれらは全て選択し他の2あるいは1も選択する。

2が偶数個あるときは数自体を減らさずに個数のみを減らせる。

奇数個のときは最後の1つだけが相手が見つからず誰かを消すことになる。

これを書けば良い。



----解説ここまで---- */



LL N;



LL ans = 0LL;



int main() {

	cin.tie(0);

	ios_base::sync_with_stdio(false);



	cin >> N;

	VI a(N);

	VI cnt(100005);

	FOR(i, 0, N) {

		cin >> a[i];

		cnt[a[i]]++;

	}

	VI pq;

	FOR(i, 0, 100005) {

		if (cnt[i])pq.push_back(cnt[i]);



	}

	int even = 0;

	FOR(i, 0, SZ(pq)) {

		if (pq[i] % 2 == 0)even++;

	}

	ans = SZ(pq);

	if (even % 2 == 1)ans--;

	cout << ans << "\n";



	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 8.072244024781755x):
#include<stdio.h>

const int M = 1e5+5;



int arr[M] = {0};



int main(){

	int n,i,j;

	int num1 = 0;

	int num2 = 0;

	int ans = 0;

	scanf("%d",&n);

	for(i = 0; i < n; i++){

		scanf("%d",&j);

		if(arr[j] == 0){

			arr[j] = 1;

			num1++;

		}

		else{

			num2++;

		}

	}

	if(num2 % 2 == 0) ans = num1;

	else ans = num1 -1;

	printf("%d",ans);

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

#define     SZ  50500

#define     LIM 2500005

#define     pii pair<int, int>

#define     pb  push_back

#define     ff  first

#define     ss  second





int main()

{

    //freopen("in.txt", "r", stdin);

    //freopen("out.txt", "w", stdout);

    ios_base::sync_with_stdio(false);

    cin.tie(NULL);

    int i, j, k;

    int n; cin>>n;

    int x;

    set<int> st;

    for (i = 0; i < n; i++)

    {

        cin>>x;

        st.insert(x);

    }

    int sz = st.size();



    if (sz % 2 == 0) cout<<(sz-1)<<"\n";

    else cout<<sz<<"\n";

    return 0;

}




// Faster C++ solution for the same problem (measured speedup: 5.3656113642549235x):
#include<stdio.h>

const int M = 1e5+5;



int arr[M] = {0};



int main(){

	int n,i,j;

	int num1 = 0;

	int num2 = 0;

	int ans = 0;

	scanf("%d",&n);

	for(i = 0; i < n; i++){

		scanf("%d",&j);

		if(arr[j] == 0){

			arr[j] = 1;

			num1++;

		}

		else{

			num2++;

		}

	}

	if(num2 % 2 == 0) ans = num1;

	else ans = num1 -1;

	printf("%d",ans);

}
// Slower C++ solution:
/* ===================================*/

/* Author :   MD FAHAD                */

/* Email  :   fahad.mohad99@gmail.com */

/* Institute: HSTU                    */

/* ===================================*/



#include <cstdio>

#include <iostream>

#include <cmath>

#include <cstring>

#include <cstdlib>

#include <cctype>

#include <algorithm>

#include <string>

#include <sstream>

#include <vector>

#include <queue>

#include <stack>

#include <list>

#include <map>

#include <set>

using  namespace  std;







#define PI              acos(-1.0)

#define lcm(a,b)        (a * (b / __gcd(a,b)))



#define READ_IN freopen("Input.txt","r",stdin)

#define READ_OUT freopen("Output.txt","w",stdout)



typedef long long int           ll;

typedef unsigned long long int  llu;



int main(void)

{

    int N; cin >> N;



    set<int> a;



    for(int i=0;i<N;i++){



        int x; cin >> x;



        a.insert(x);

    }



    int k = a.size();





    if(k%2==0)

    cout << k-1 << "\n";

    else

        cout << k << "\n";





    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.295159831783742x):
#include<stdio.h>

const int M = 1e5+5;



int arr[M] = {0};



int main(){

	int n,i,j;

	int num1 = 0;

	int num2 = 0;

	int ans = 0;

	scanf("%d",&n);

	for(i = 0; i < n; i++){

		scanf("%d",&j);

		if(arr[j] == 0){

			arr[j] = 1;

			num1++;

		}

		else{

			num2++;

		}

	}

	if(num2 % 2 == 0) ans = num1;

	else ans = num1 -1;

	printf("%d",ans);

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



using VS = vector<string>;    using LL = long long;

using VI = vector<int>;       using VVI = vector<VI>;

using PII = pair<int, int>;   using PLL = pair<LL, LL>;

using VL = vector<LL>;        using VVL = vector<VL>;



#define ALL(a)  begin((a)),end((a))

#define RALL(a) (a).rbegin(), (a).rend()

#define PB push_back

#define EB emplace_back

#define MP make_pair

#define SZ(a) int((a).size())

#define SORT(c) sort(ALL((c)))

#define RSORT(c) sort(RALL((c)))

#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))

#define FOR(i, s, e) for (int(i) = (s); (i) < (e); (i)++)

#define FORR(i, s, e) for (int(i) = (s); (i) > (e); (i)--)

#define debug(x) cerr << #x << ": " << x << endl

const int INF = 1e9;                          const LL LINF = 1e16;

const LL MOD = 1000000007;                    const double PI = acos(-1.0);

int DX[8] = { 0, 0, 1, -1, 1, 1, -1, -1 };    int DY[8] = { 1, -1, 0, 0, 1, -1, 1, -1 };



/* -----  2018/02/23  Problem: 068_arc_b / Link: https://arc068.contest.atcoder.jp/tasks/arc068_b?lang=en  ----- */

/* ------問題------



すぬけくんはカードゲームで遊ぶことにしました。 N 枚からなるカードの山があり、上から i 枚目のカードには整数 Ai が書かれています。

すぬけくんはこのカードの山に対し 0 回以上、以下の操作を行い、残ったカードに書かれた値が互いに異なるようにしたいです。最大で何枚のカードを残すことが可能か求めなさい。なお、N は奇数であり、少なくとも 1 枚のカードを残すことが可能であることが保証されます。

操作：カードの山から任意の 3 枚のカードを抜き出す。抜き出したカードのうち書かれた値が最大であるようなカード 1 枚と最小であるようなカード 1 枚の合計 2 枚を選んで食べる。その後残った 1 枚をカードの山に戻す。



-----問題ここまで----- */

/* -----解説等-----



数字をまとめて個数で考える。

3個以上のものは同じものだけを選択することで全部1か2になる。

2についてこれらは全て選択し他の2あるいは1も選択する。

2が偶数個あるときは数自体を減らさずに個数のみを減らせる。

奇数個のときは最後の1つだけが相手が見つからず誰かを消すことになる。

これを書けば良い。



----解説ここまで---- */



LL N;



LL ans = 0LL;



int main() {

	cin.tie(0);

	ios_base::sync_with_stdio(false);



	cin >> N;

	VI a(N);

	VI cnt(100005);

	FOR(i, 0, N) {

		cin >> a[i];

		cnt[a[i]]++;

	}

	VI pq;

	FOR(i, 0, 100005) {

		if (cnt[i])pq.push_back(cnt[i]);



	}

	int even = 0;

	FOR(i, 0, SZ(pq)) {

		if (pq[i] % 2 == 0)even++;

	}

	ans = SZ(pq);

	if (even % 2 == 1)ans--;

	cout << ans << "\n";



	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.503298109534406x):
#include <bits/stdc++.h>



using namespace std ;



int main()

{

	ios_base::sync_with_stdio(0) ;

	cin.tie(0) ;

	int n ;

	cin>>n ;

	int arr[n] ;

	for(int i = 0 ; i < n ; ++i)

		cin>>arr[i] ;

	int ans = 1 ;

	set<int>s ;

	for(int i = 0 ; i < n ; ++i)

	{

		if(arr[i] != arr[n/2+1])

			s.insert(arr[i]) ;

	}

	while(s.size() > 0)

	{

		int a = *s.begin() ;

		int b = *s.rbegin() ;

		if(a == b)

			break ;

		ans += 2 ;

		s.erase(a) ;

		s.erase(b) ;

	}

	return cout<<ans<<"\n" , 0 ;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



using VS = vector<string>;    using LL = long long;

using VI = vector<int>;       using VVI = vector<VI>;

using PII = pair<int, int>;   using PLL = pair<LL, LL>;

using VL = vector<LL>;        using VVL = vector<VL>;



#define ALL(a)  begin((a)),end((a))

#define RALL(a) (a).rbegin(), (a).rend()

#define PB push_back

#define EB emplace_back

#define MP make_pair

#define SZ(a) int((a).size())

#define SORT(c) sort(ALL((c)))

#define RSORT(c) sort(RALL((c)))

#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))

#define FOR(i, s, e) for (int(i) = (s); (i) < (e); (i)++)

#define FORR(i, s, e) for (int(i) = (s); (i) > (e); (i)--)

#define debug(x) cerr << #x << ": " << x << endl

const int INF = 1e9;                          const LL LINF = 1e16;

const LL MOD = 1000000007;                    const double PI = acos(-1.0);

int DX[8] = { 0, 0, 1, -1, 1, 1, -1, -1 };    int DY[8] = { 1, -1, 0, 0, 1, -1, 1, -1 };



/* -----  2018/02/23  Problem: 068_arc_b / Link: https://arc068.contest.atcoder.jp/tasks/arc068_b?lang=en  ----- */

/* ------問題------



すぬけくんはカードゲームで遊ぶことにしました。 N 枚からなるカードの山があり、上から i 枚目のカードには整数 Ai が書かれています。

すぬけくんはこのカードの山に対し 0 回以上、以下の操作を行い、残ったカードに書かれた値が互いに異なるようにしたいです。最大で何枚のカードを残すことが可能か求めなさい。なお、N は奇数であり、少なくとも 1 枚のカードを残すことが可能であることが保証されます。

操作：カードの山から任意の 3 枚のカードを抜き出す。抜き出したカードのうち書かれた値が最大であるようなカード 1 枚と最小であるようなカード 1 枚の合計 2 枚を選んで食べる。その後残った 1 枚をカードの山に戻す。



-----問題ここまで----- */

/* -----解説等-----



数字をまとめて個数で考える。

3個以上のものは同じものだけを選択することで全部1か2になる。

2についてこれらは全て選択し他の2あるいは1も選択する。

2が偶数個あるときは数自体を減らさずに個数のみを減らせる。

奇数個のときは最後の1つだけが相手が見つからず誰かを消すことになる。

これを書けば良い。



----解説ここまで---- */



LL N;



LL ans = 0LL;



int main() {

	cin.tie(0);

	ios_base::sync_with_stdio(false);



	cin >> N;

	VI a(N);

	VI cnt(100005);

	FOR(i, 0, N) {

		cin >> a[i];

		cnt[a[i]]++;

	}

	VI pq;

	FOR(i, 0, 100005) {

		if (cnt[i])pq.push_back(cnt[i]);



	}

	int even = 0;

	FOR(i, 0, SZ(pq)) {

		if (pq[i] % 2 == 0)even++;

	}

	ans = SZ(pq);

	if (even % 2 == 1)ans--;

	cout << ans << "\n";



	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.1090890448551571x):
#include<cstdio>

#include<iostream>

#include<map>

#include<cmath>

#include<algorithm>

#include<cstring>

#include<string>

using namespace std;

int a[100005],x,ans;

int main(){

	int n;

	cin >> n;

	for(int i = 1;i <= n;i++){

		cin >> x;

		a[x]++;

	}

	for(int i = 1;i <= 100003;i++){

		if(a[i]>1)ans+=(a[i]-1);

		}

	if(ans%2)ans+=1;

	cout << n - ans <<endl;

	return 0;

	}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



using VS = vector<string>;    using LL = long long;

using VI = vector<int>;       using VVI = vector<VI>;

using PII = pair<int, int>;   using PLL = pair<LL, LL>;

using VL = vector<LL>;        using VVL = vector<VL>;



#define ALL(a)  begin((a)),end((a))

#define RALL(a) (a).rbegin(), (a).rend()

#define PB push_back

#define EB emplace_back

#define MP make_pair

#define SZ(a) int((a).size())

#define SORT(c) sort(ALL((c)))

#define RSORT(c) sort(RALL((c)))

#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))

#define FOR(i, s, e) for (int(i) = (s); (i) < (e); (i)++)

#define FORR(i, s, e) for (int(i) = (s); (i) > (e); (i)--)

#define debug(x) cerr << #x << ": " << x << endl

const int INF = 1e9;                          const LL LINF = 1e16;

const LL MOD = 1000000007;                    const double PI = acos(-1.0);

int DX[8] = { 0, 0, 1, -1, 1, 1, -1, -1 };    int DY[8] = { 1, -1, 0, 0, 1, -1, 1, -1 };



/* -----  2018/02/23  Problem: 068_arc_b / Link: https://arc068.contest.atcoder.jp/tasks/arc068_b?lang=en  ----- */

/* ------問題------



すぬけくんはカードゲームで遊ぶことにしました。 N 枚からなるカードの山があり、上から i 枚目のカードには整数 Ai が書かれています。

すぬけくんはこのカードの山に対し 0 回以上、以下の操作を行い、残ったカードに書かれた値が互いに異なるようにしたいです。最大で何枚のカードを残すことが可能か求めなさい。なお、N は奇数であり、少なくとも 1 枚のカードを残すことが可能であることが保証されます。

操作：カードの山から任意の 3 枚のカードを抜き出す。抜き出したカードのうち書かれた値が最大であるようなカード 1 枚と最小であるようなカード 1 枚の合計 2 枚を選んで食べる。その後残った 1 枚をカードの山に戻す。



-----問題ここまで----- */

/* -----解説等-----



数字をまとめて個数で考える。

3個以上のものは同じものだけを選択することで全部1か2になる。

2についてこれらは全て選択し他の2あるいは1も選択する。

2が偶数個あるときは数自体を減らさずに個数のみを減らせる。

奇数個のときは最後の1つだけが相手が見つからず誰かを消すことになる。

これを書けば良い。



----解説ここまで---- */



LL N;



LL ans = 0LL;



int main() {

	cin.tie(0);

	ios_base::sync_with_stdio(false);



	cin >> N;

	VI a(N);

	VI cnt(100005);

	FOR(i, 0, N) {

		cin >> a[i];

		cnt[a[i]]++;

	}

	VI pq;

	FOR(i, 0, 100005) {

		if (cnt[i])pq.push_back(cnt[i]);



	}

	int even = 0;

	FOR(i, 0, SZ(pq)) {

		if (pq[i] % 2 == 0)even++;

	}

	ans = SZ(pq);

	if (even % 2 == 1)ans--;

	cout << ans << "\n";



	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.1122159440293256x):
#include <bits/stdc++.h>

using namespace std;

const int M=1e5+10;

int a[M],cnt;

int main()

{

    int n;scanf("%d",&n);

    for(int i=1;i<=n;i++)

    {

        int x;scanf("%d",&x);

        a[x]++;

    }

    int cost=0;

    for(int i=1;i<M;i++)if(a[i]>=2)

    {

        if(a[i]%2==0)

        {

            cost+=a[i]-2;

            cnt++;

        }

        else cost+=a[i]-1;



    }

    cost+=(cnt/2)*2;

    if(cnt%2==1)cost+=2;

    printf("%d\n",n-cost);

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



using VS = vector<string>;    using LL = long long;

using VI = vector<int>;       using VVI = vector<VI>;

using PII = pair<int, int>;   using PLL = pair<LL, LL>;

using VL = vector<LL>;        using VVL = vector<VL>;



#define ALL(a)  begin((a)),end((a))

#define RALL(a) (a).rbegin(), (a).rend()

#define PB push_back

#define EB emplace_back

#define MP make_pair

#define SZ(a) int((a).size())

#define SORT(c) sort(ALL((c)))

#define RSORT(c) sort(RALL((c)))

#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))

#define FOR(i, s, e) for (int(i) = (s); (i) < (e); (i)++)

#define FORR(i, s, e) for (int(i) = (s); (i) > (e); (i)--)

#define debug(x) cerr << #x << ": " << x << endl

const int INF = 1e9;                          const LL LINF = 1e16;

const LL MOD = 1000000007;                    const double PI = acos(-1.0);

int DX[8] = { 0, 0, 1, -1, 1, 1, -1, -1 };    int DY[8] = { 1, -1, 0, 0, 1, -1, 1, -1 };



/* -----  2018/02/23  Problem: 068_arc_b / Link: https://arc068.contest.atcoder.jp/tasks/arc068_b?lang=en  ----- */

/* ------問題------



すぬけくんはカードゲームで遊ぶことにしました。 N 枚からなるカードの山があり、上から i 枚目のカードには整数 Ai が書かれています。

すぬけくんはこのカードの山に対し 0 回以上、以下の操作を行い、残ったカードに書かれた値が互いに異なるようにしたいです。最大で何枚のカードを残すことが可能か求めなさい。なお、N は奇数であり、少なくとも 1 枚のカードを残すことが可能であることが保証されます。

操作：カードの山から任意の 3 枚のカードを抜き出す。抜き出したカードのうち書かれた値が最大であるようなカード 1 枚と最小であるようなカード 1 枚の合計 2 枚を選んで食べる。その後残った 1 枚をカードの山に戻す。



-----問題ここまで----- */

/* -----解説等-----



数字をまとめて個数で考える。

3個以上のものは同じものだけを選択することで全部1か2になる。

2についてこれらは全て選択し他の2あるいは1も選択する。

2が偶数個あるときは数自体を減らさずに個数のみを減らせる。

奇数個のときは最後の1つだけが相手が見つからず誰かを消すことになる。

これを書けば良い。



----解説ここまで---- */



LL N;



LL ans = 0LL;



int main() {

	cin.tie(0);

	ios_base::sync_with_stdio(false);



	cin >> N;

	VI a(N);

	VI cnt(100005);

	FOR(i, 0, N) {

		cin >> a[i];

		cnt[a[i]]++;

	}

	VI pq;

	FOR(i, 0, 100005) {

		if (cnt[i])pq.push_back(cnt[i]);



	}

	int even = 0;

	FOR(i, 0, SZ(pq)) {

		if (pq[i] % 2 == 0)even++;

	}

	ans = SZ(pq);

	if (even % 2 == 1)ans--;

	cout << ans << "\n";



	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.41282545627392x):
#include <algorithm>

#include <iostream> 

#include <cstring>

using namespace std;

int main()

{

	bool exi[(int)1e5+10];

	memset(exi,0,sizeof(exi));

	int n;

	cin>>n;

	int sum=0;

	for(int i=0;i<n;i++)

	{

		int a;

		cin>>a;

		if(!exi[a])

		{

			sum++;

			exi[a]=1;

		 } 

	} 

	if(sum%2==0) cout<<sum-1<<endl;

	else cout<<sum<<endl;

}
// Slower C++ solution:
#include<cstdio>

#include<iostream>

#include<map>

#include<cmath>

#include<algorithm>

#include<cstring>

#include<string>

using namespace std;

int a[100005],x,ans;

int main(){

	int n;

	cin >> n;

	for(int i = 1;i <= n;i++){

		cin >> x;

		a[x]++;

	}

	for(int i = 1;i <= 100003;i++){

		if(a[i]>1)ans+=(a[i]-1);

		}

	if(ans%2)ans+=1;

	cout << n - ans <<endl;

	return 0;

	}


// Faster C++ solution for the same problem (measured speedup: 1.2738611591447373x):
#include <algorithm>

#include <iostream> 

#include <cstring>

using namespace std;

int main()

{

	bool exi[(int)1e5+10];

	memset(exi,0,sizeof(exi));

	int n;

	cin>>n;

	int sum=0;

	for(int i=0;i<n;i++)

	{

		int a;

		cin>>a;

		if(!exi[a])

		{

			sum++;

			exi[a]=1;

		 } 

	} 

	if(sum%2==0) cout<<sum-1<<endl;

	else cout<<sum<<endl;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

const int M=1e5+10;

int a[M],cnt;

int main()

{

    int n;scanf("%d",&n);

    for(int i=1;i<=n;i++)

    {

        int x;scanf("%d",&x);

        a[x]++;

    }

    int cost=0;

    for(int i=1;i<M;i++)if(a[i]>=2)

    {

        if(a[i]%2==0)

        {

            cost+=a[i]-2;

            cnt++;

        }

        else cost+=a[i]-1;



    }

    cost+=(cnt/2)*2;

    if(cnt%2==1)cost+=2;

    printf("%d\n",n-cost);

}


// Faster C++ solution for the same problem (measured speedup: 1.270279808393637x):
#include <algorithm>

#include <iostream> 

#include <cstring>

using namespace std;

int main()

{

	bool exi[(int)1e5+10];

	memset(exi,0,sizeof(exi));

	int n;

	cin>>n;

	int sum=0;

	for(int i=0;i<n;i++)

	{

		int a;

		cin>>a;

		if(!exi[a])

		{

			sum++;

			exi[a]=1;

		 } 

	} 

	if(sum%2==0) cout<<sum-1<<endl;

	else cout<<sum<<endl;

}