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