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