Rezolvare completă PbInfo #2046 carte2

În timpul activităților din “Săptămâna Altfel” elevii clasei a VII-a doresc să ajute la organizarea cărților din biblioteca școlii. Fiecare carte este etichetată cu un cod care este exprimat printr-un un șir de caractere distincte. Acestea pot fi cifrele 0, 1,..,9 și primele zece litere mici ale alfabetului englez a, b,..,j. Codul identifică în mod unic fiecare carte, adică nu vor exista două cărți cu același cod, dar şi genul literar din care acestea face parte. Cărțile din acelaşi gen literar au codul de identificare format din aceleaşi caractere, distincte, dispuse în altă ordine.

Numim coduri pereche două coduri de identificare care au același număr de caractere și care diferă printr-un
caracter. De exemplu, codurile 42a8 și 2c8a sunt coduri pereche. Pe de altă parte, codurile 42a8 și 248a,
respectiv 42ab și 248c, nu sunt coduri pereche.

Cerința

Fiind dat șirul celor N coduri de identificare, scrieţi un program care să rezolve următoarele cerinţe:

  1. determină numărul de cărți din cel mai numeros gen literar și numărul de genuri literare care au acest număr maxim de cărți.
  2. determină numărul de coduri, din șirul celor N, care sunt coduri pereche cu ultimul cod din șir

Date de intrare

Fişierul de intrare carte.in conţine pe prima linie un număr natural C. Pentru toate testele, C poate lua
numai valorile 1 sau 2. Pe a doua linie se află numărul N de cărți din biblioteca școlii, iar pe următoarele N
linii, câte un șir de caractere pe fiecare linie, ce reprezintă codul pentru identificarea unei cărți.

Date de ieșire

Dacă valoarea lui C este 1, se va rezolva numai cerința 1. În acest caz, fişierul de ieşire carte.out conţine
pe prima linie numărul maxim de cărți de același gen literar, MAX, iar pe a doua linie numărul de genuri
literare care au exact MAX cărți.

Dacă valoarea lui C este 2, se va rezolva numai cerința 2. În acest caz, fişierul de ieşire carte.out conţine
pe prima linie numărul de coduri pereche cu ultimul cod din șirul celor N.

Restricții și precizări

  • 1 ≤ N ≤ 1 000 000
  • Pentru rezolvarea corectă a primei cerințe se obțin 60 de puncte, iar pentru rezolvarea corectă a celei de
    a doua cerinţe se acordă 40 de puncte

Exemplul 1

carte.in

1
8
1289f5
128905
129805
219805
12
1e2
12e
e21

carte.out

3
2

Explicație

Sunt maxim 3 cărți de același gen literar. Sunt 2 genuri cu număr maxim de cărți: {128905, 129805, 219805} și
{1e2, 12e, e21 }.

Exemplul 2

carte.in

2
10
1289f5
128905
5
12
129805
219805
218905
132
312
2189e5

carte.out

5

Explicație

Sunt 5 coduri pereche cu 2189e5: 1289f5, 128905, 129805, 219805, 218905.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema carte2:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <ctype.h>
#define Nmax 1300000

int A[Nmax], poz, j, P, N, K, l, k, x,Max, nMax, y, S=0;
int i, mx, n, cx, ed, nrC=0, C, mp, np, ngen, nm, Vmax, nr, nc, cmx, mu, nu;
char s[25], c;

int main()
{
    freopen("carte.in", "r", stdin);
    freopen("carte.out","w", stdout);

    scanf("%d\n%d\n",&C,&N);

    assert(0 < N && N <= 1000000);

    for( i = 1; i <= N; i++)
    {
        s[0]='\0';
        scanf("%s\n", &s);
        n = strlen(s);
        assert(0 < n && n <= 20);
        mx = 0; j = 0;
        while(j < n)
        {
            assert(isdigit(s[j]) || isalpha(s[j]) && s[j]<='j');
            if(isdigit(s[j])) x=s[j]-'0'; else x=s[j]-'a' + 10;
            mx |= 1<<x;
            ++j;
        }
        A[mx]++;
        if(A[mx]==1) ngen++;
        if(A[mx] > Max) Max = A[mx], nMax=1;
        else if(A[mx] == Max) nMax++;
        if(i==N) {mu = mx; nu = n;}
        if(mx>Vmax) Vmax=mx;
    }
        if(C==1) printf("%d\n%d\n", Max, nMax);
        else {
            for(mx = 0; mx <= Vmax; mx++)
                if(A[mx]){
                    ed = mu ^ mx;
                    nc=0;
                    do {ed &= ed-1; nc++;} while (ed);
                    nr=0; cmx = mx;
                    do { cmx&= cmx-1; nr++;} while (cmx);
                    if(nr==nu && nc==2) nrC+=A[mx];
                }
                printf("%d\n", nrC);
        }
        s[0]='\0';
        scanf("%s\n", &s);
        n = strlen(s);
        assert(0==n);
        return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2046 carte2

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2046 carte2 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!