Rezolvare completă PbInfo #2906 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

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

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 Potrivire:

#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 << "
";
    
    fin.close();
    fout.close();
    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 #2906 Potrivire

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2906 Potrivire 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!