2906 - Potrivire

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.

Sursa: - Potrivire


Cerinţa

Gigel a găsit un șir de n cifre minunate. A adormit cu ele în brațe și a visat m numere naturale. Nedumerit, a cerut părerea vrăjitoarei Ghiocica. Acesta i-a spus:

  • - Gigele, ești norocos. Suma numerelor distincte visate care sunt scrise cu cifre consecutive în șirul de cifre minunate este suma pe care o vei câștiga la Loto.

Nerăbdător, Gigel vă roagă să scrieți un program care să citească cele n cifre și cele m numere și să determine suma pe care o va câștiga la Loto.

Date de intrare

Fișierul de intrare potrivire.in conține pe prima linie numărul n; a doua linie conține șirul de n cifre. A treia linie conține numărul m, iar a patra linie conține cele m numere.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.", iar apoi in fișierul de ieșire potrivire.out va conține pe prima linie numărul S, reprezentând suma pe care o va câștiga Gigel. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricţii şi precizări

  • 1 ≤ n, m ≤ 100.000
  • pentru 50% din teste, 1 ≤ n, m ≤ 1000
  • cele m numere visate sunt numere naturale și au cel mult cinci cifre

Exemple

Exemplul 1

potrivire.in
10
4 5 6 2 6 0 7 1 9 7
6
456 662 2607 2607 97 975
Ieșire
Datele sunt corecte.
potrivire.out
3160

Exemplul 2

potrivire.in
6
1 0 3 1 4 5
8
111 1231 4124 5741 4124 22 21 12
Ieșire
Datele sunt corecte.
potrivire.out
0

Exemplul 3

potrivire.in
10
4 5 6 2 6 0 7 1 9 7
2
12414124215 1251251512
Ieșire
Datele nu sunt comform restricțiilor impuse.


Rezolvare

#2906 - Potrivire


def potrivire(n, cifre, m, numere_visate):
    f = open("potrivire.out", "w")
    frecventa = {}
    s = 0
    for i in range(n):
        num = 0
        for j in range(i, min(i + 4, n)):
            num = num * 10 + cifre[j]
            if num not in frecventa:
                frecventa[num] = 0
            frecventa[num] += 1
    for i in range(m):
        if numere_visate[i] in frecventa and frecventa[numere_visate[i]] != 0 and frecventa[numere_visate[i]] != -1:
            s += numere_visate[i]
            frecventa[numere_visate[i]] = -1
    f.write(str(s))
    f.close()

def conform_restrictiilor():
    with open("potrivire.in", "r") as f:
        n = int(f.readline())
        cifre = list(map(int, f.readline().split()))
        m = int(f.readline())
        numere_visate = list(map(int, f.readline().split()))
        if not (1 <= m <= 100000) and not (1 <= n <= 100000):
            print("Datele nu sunt conform restricțiilor impuse.")
            exit()
        for x in numere_visate:
            if x > 100000:
                print("Datele nu sunt conform restricțiilor impuse.")
                exit()
        for x in cifre:
            if x >= 10:
                print("Datele nu sunt conform restricțiilor impuse.")
                exit()
        print("Datele sunt corecte.")
        return n, cifre, m, numere_visate

if __name__ == '__main__':
    n, cifre, m, numere_visate = conform_restrictiilor()
    potrivire(n, cifre, m, numere_visate)

Explicaţie cod

Funcția conform_restrictiilor() verifică dacă datele de intrare sunt conforme cu restricțiile impuse în problemă, respectiv: n și m trebuie să fie între 1 și 100.000, inclusiv, cifre și numere_visate trebuie să conțină numere între 0 și 100.000, inclusiv, iar cifrele din cifre trebuie să fie mai mici decât 10.

Funcția potrivire() primește ca argumente n, cifre, m și numere_visate, determină toate numerele care pot fi formate prin combinarea unui subset de cifre consecutive din cifre, și calculează suma tuturor numerelor din numere_visate care se regăsesc printre numerele calculate. Aceasta se realizează prin parcurgerea tuturor subset-urilor de cifre consecutive și adăugarea numerelor rezultate într-un dicționar care memorează frecvența aparițiilor acestora. Apoi, pentru fiecare număr din numere_visate, se verifică dacă acesta se regăsește în dicționar și dacă apare cel puțin o dată și nu a fost deja adăugat la sumă.

La final, suma calculată este scrisă în fișierul potrivire.out.