2217 - Map

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Domnul Map vă pune la dispoziție un șir a[1], a[2], …, a[n] de numere naturale.

Cerința

Pentru fiecare a[i] (i=1..n) trebuie să spuneți de câte ori apare acest element în secvența a[1], a[2], …, a[i].

Date de intrare

Fișierul de intrare mapin.txt conține pe prima linie numărul n. Pe linia a doua, separate prin câte un spațiu, sunt elementele șirului.

Date de ieșire

În fișierul de ieșire mapout.txt se vor afișa pe primul rând n numere naturale, al i-lea număr reprezentând numărul de apariții ale lui a[i] în secvența a[1], a[2], …, a[i].

Restricții și precizări

  • 1 ≤ n ≤ 200 000
  • 0 <= a[i] <= 1018

Exemplul 1:

mapin.txt

7
1 9876543210 1 3 3 9876543210 9876543210

mapout.txt

Datele de intrare corespund restrictiilor impuse
1 1 2 1 2 2 3

Exemplul 2:

mapin.txt

map

mapout.txt

Datele de intrare nu corespund restrictiilor impuse

Explicație

Primul element este 1. Apare o singură dată până acum. Al doilea element este 9876543210. Și el apare pentru prima dată. Al treilea element este 1. Apare a doua oară. Al patrulea element este 3. Apare prima oară. Al cincilea element este 3. Apare a doua oară. Al șaselea element este 9876543210. Apare a doua oară. Al șaptelea element este 9876543210. Apare a treia oară.

Rezolvare

from collections import defaultdict


def validare(nr_n, string, fisier_out):           # functia de validare a datelor de intrare
    if not (1 <= nr_n <= 200000):
        raise ValueError("n nu este in intervalul [1, 200000]")

    for numar in string:
        if not (0 <= numar <= 10**18):    # fiecare numar trebuie sa fie intre 0 si 10^18
            raise ValueError("Un numar din sir nu este in intervalul [0, 10^18]")

    fisier_out.write("Datele de intrare corespund restrictiilor impuse\n")


def rezolvare(string, fisier_out):                     # functia de rezolvare
    aparitii = defaultdict(int)
    for numar in string:
        aparitii[numar] += 1
        fisier_out.write(str(aparitii[numar]) + " ")


if __name__ == '__main__':
    file_in = open("mapin.txt", "r")         # declararea fisierelor
    file_out = open("mapout.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)

    try:
        n_str = file_in.readline().strip()  # citirea numarului ca sir de caractere
        try:
            n = int(n_str)  # incercam sa convertim sirul de caractere in numar intreg
        except ValueError:
            file_out.write("Datele de intrare nu corespund restrictiilor impuse\n")
            file_in.close()
            file_out.close()
            exit(0)  # iesim din program daca conversia esueaza

        sir = list(map(int, file_in.readline().split()))

        validare(n, sir, file_out)  # apelul functiei de validare
        rezolvare(sir, file_out)  # apelul functiei de rezolvare

    except ValueError as ve:
        file_out.write(str(ve))
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")

    file_in.close()
    file_out.close()