fbpx

Problema #2931 – Parap – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dau N numere naturale a1,a2ana1,a2an. 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] ≤ 1018

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

S-ar putea sa iti placa