fbpx

Problema #2906 – Potrivire – Rezolvari PBInfo

de Mihai-Alexandru

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 ≤ 100000
  • 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ă.

#include <bits/stdc++.h>
using namespace std;

ifstream cin("potrivire.in");
ofstream cout("potrivire.out");

long long n , m , a[100001] , x , f[100001];
long long s;


int main()
{
    cin >> n;
    for(int i = 1 ; i <= n ; i++)
        cin >> a[i];

    for(int i = 1 ; i <= n ; i++)
    {
        int num = 0;
        for(int j = i ; j <= i + 4 && j <= n ; j++)
        {
            num = num* 10 + a[j];
            f[num]++;
        }
    }
    cin >> m;
    for(int i = 1 ; i <= m ; i++)
    {
        cin >> x;
        if(f[x] != 0 && f[x] != -1) s+= x;
        f[x] = -1;
    }
    cout << s;
}
Comentarii

S-ar putea sa iti placa