Cerința
Se dau N
numere naturale a1,a2…an. O pereche (a[j],a[k])
cu 1≤j<k≤N
se numește pereche specială dacă are proprietatea că din a[j]
și a[k]
prin “lipire” se formează un număr X
în care cifrele conținute apar de număr par de ori. De exemplu numerele 123
şi 21223
dacă se lipesc produc numărul 12321223
în care 1
apare de 2
ori, 2
apare de 4
ori și 3
apare de 2
ori.
Să se determine numărul perechilor speciale.
Date de intrare
Pe primul rând al fișierului text parap.in
se află numărul natural N
reprezentând numărul de elemente ale șirului dat. Pe al doilea rând, separate prin câte un spațiu se află elementele șirului dat.
Date de ieșire
Pe primul rând în fișierul de ieșire parap.out
se va scrie un număr natural reprezentând numărul perechilor speciale.
Restricții și precizări
2 ≤ N ≤ 100.000
1 ≤ a[k] ≤ 10
18
Exemplu
parap.in
10 4 1 13 5 42 2 1 2 112 212
parap.out
6
Explicație
Perechile speciale sunt (1,1),(1,212),(2,2),(2,112),(1,212),(2,112)
.
#include <bits/stdc++.h> using namespace std; ifstream cin("parap.in"); ofstream cout("parap.out"); long long n , x , cnt = 1 , a[100001] , sum; long long frecv(long long x) { long long f[15] = {0} , nr = 0; while(x != 0) { f[x % 10]++; x /= 10; } for(int i = 0 ; i <= 9 ; i++) nr = nr * 10 + f[i] % 2; return nr; } int main() { cin >> n; for(int i = 1 ; i <= n ; i++) { cin >> x; a[i] = frecv(x); } sort(a + 1 , a + n + 1); for(int i = 2 ; i <= n ; i++) if(a[i] == a[i - 1]) cnt++; else { sum = sum + cnt * (cnt - 1) / 2; cnt = 1; } sum = sum + cnt * (cnt - 1) / 2; cnt = 1; cout << sum; }