fbpx

Problema #851 – Email – Rezolvari PBInfo

de Mihai-Alexandru

O adresă de email este alcătuită din numele de utilizator și numele de domeniu, separate prin simbolul @. De exemplu, [email protected] este o adresă de email corectă ca structură, chiar dacă inexistentă.

Cerința

Se dă o listă de adrese de email corecte ca structură. Să se determine câte adrese de email sunt asociate cu fiecare nume de domeniu.

Date de intrare

Fișierul de intrare email.in conține mai multe adrese de email, câte una pe o linie.

Date de ieșire

Fișierul de ieșire email.out va conține pe prima linie numărul C de nume de domenii diferite. Următoarele C linii conțin câte un nume de domeniu, urmat de un spațiu și de numărul de adrese date asociate cu acel domeniu. Numele de domeniu se vor afișa în ordine descrescătoare a numărului de adrese asociate. Dacă există mai multe nume de domenii cu același număr de adrese asociate, se vor afișa în ordine lexicografică.

Restricții și precizări

  • fișierul de intrare va conține cel mult 1000 de adrese distincte, cu cel mult 200 de domenii distincte;
  • lungimea maximă a unei adrese de email este de 50 de caractere;
  • numele de domeniu începe după simbolul @ și se termină la sfârșitul adresei;
  • adresa de email nu conține spații sau alte caractere albe.

Exemplu

email.in

[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]

email.out

3
yahoo.com 3
gmail.com 2
pbinfo.ro 2
#include <bits/stdc++.h>

using namespace std;

ifstream cin("email.in");
ofstream cout("email.out");

char m[1001][51];
char r[1001][51];
int vec[1001];

bool domegal(int i , int j)
{
    int n = 0;
    while(m[i][n]!='@')
        n++;
    n++;
    int e = 0;
    while(m[j][e]!='@')
        e++;
    e++;
    for(int q = n , h = e ; m[i][q]!='\0' && m[j][h]!='\0' ; ++q , h++)
        if(m[i][q]!=m[j][h])
            return 0;
    return 1;
}

int main()
{
    int i = 0;
    while(cin >> m[i])
        i++;
    int n = i;
    int c = 0;
    for(int i = 0 ; i < n ; ++i)
    {
        int cnt = 1;
        if(m[i][0]!='\0')
        {
            for(int j = i + 1 ; j < n ; ++j)
                if(domegal(i , j))
                    cnt++ , m[j][0]='\0';
            int q = 0;
            while(m[i][q]!='@')
                q++;
            q++;
            int t=0;
            while(m[i][q]!='\0')
                r[c][t]=m[i][q], q++ , t++;
            vec[c]=cnt;
            c++;
            m[i][0]='\0';
        }
    }
    for(int i = 0 ; i < c ; ++i)
        for(int j = i + 1 ; j < c ; ++j)
            if(strcmp(r[i] , r[j]) > 0)
                swap(r[i] , r[j]) , swap(vec[i] , vec[j]);
    cout << c << '\n';
    int maxi=0;
    for(int i = 0 ; i < c ; ++i)
        if(vec[i]>maxi)
            maxi=vec[i];
    while(maxi)
    {
        for(int i = 0 ; i < c ; ++i)
        {
            if(vec[i]==maxi)
                cout << r[i] << ' ' << vec[i] << '\n';
        }
        maxi--;
    }
    return 0;
}
Comentarii

S-ar putea sa iti placa