# PBinfo #2906 – Potrivire – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

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
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.

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

Exemplu:
potrivire.in

10
4 5 6 2 6 0 7 1 9 7 
6
456 662 2607 2607 97 975
potrivire.out

3160
Explicație
Numerele distincte visate care se pot scrie cu cifre consecutive din șir sunt: 456, 2607 și 97, iar suma lor este 3160. 2607 a fost visat de două ori, dar se ia în considerare o singură dată.

## Cod sursă C++

```cpp
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cassert>
using namespace std;
ifstream fin("potrivire.in");
ofstream fout("potrivire.out");
int n, A[100001], m, x;
int S = 0;
int v[100000];
int main()
{
    fin >> n;
    for(int i = 1; i <= n ; i ++)
    {
        fin >> A[i];
        assert(A[i] >= 0 && A[i] <= 9);
    }
    for(int i = 1 ; i <= n ; i ++)
        v[A[i]] = 1;
    for(int i = 1 ; i <= n - 1; i ++)
        v[A[i]*10 + A[i+1]] = 1;
    for(int i = 1 ; i <= n - 2; i ++)
        v[A[i]*100 + A[i+1]*10+A[i+2]] = 1;
    for(int i = 1 ; i <= n - 3; i ++)
        v[A[i]*1000 + A[i+1]*100+A[i+2]*10+A[i+3]] = 1;
    for(int i = 1 ; i <= n - 4; i ++)
        v[A[i]*10000 + A[i+1]*1000 + A[i+2]*100 + A[i+3]*10 +A[i+4]] = 1;
    for(fin >> m; m ; m --)
    {
        fin >> x;
        assert(x >= 0 && x <= 99999);
        if(v[x])
            S += x, v[x] = 0;
    }
    fout << S << "\n";
    fin.close();
    fout.close();
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2906)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2906/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2906/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
