Așa cum știm, lui Gigel îi place să se joace cu numerele. A scris pe caiet un număr, apoi a văzut că din acesta se pot extrage mai multe numere cu trei cifre consecutive. De exemplu, a scris pe caiet 20172017
; numerele cu trei cifre consecutive care se pot extrage sunt 201
, 172
, 720
și 201
. Gigel începe să-și pună diferite întrebări: care este cel mai mare număr cu trei cifre consecutive obținut? Dar cel mai mic? De câte ori apar ele? Unde apar? Care este cel mai mare număr de apariții a unui număr cu trei cifre?
Cerința
Fiind numărul un număr natural n
și n
numere naturale x
(100 ≤ x ≤ 4294967295
) să se determine:
Așa cum știm, lui Gigel îi place să se joace cu numerele. A scris pe caiet un număr, apoi a văzut că din acesta se pot extrage mai multe numere cu trei cifre consecutive. De exemplu, a scris pe caiet 20172017
; numerele cu trei cifre consecutive care se pot extrage sunt 201
, 172
, 720
și 201
. Gigel începe să-și pună diferite întrebări: care este cel mai mare număr cu trei cifre consecutive obținut? Dar cel mai mic? De câte ori apar ele? Unde apar? Care este cel mai mare număr de apariții a unui număr cu trei cifre?
Cerința
Fiind numărul un număr natural n
și n
numere naturale x
(100 ≤ x ≤ 4294967295
) să se determine:
1. Cel mai mic și cel mai mare număr din trei cifre consecutive care apar în cele n
numere, de câte ori apar ele, în ce număr x[1]
apar prima dată și în ce număr x[2]
apar ultima dată.
2. Numerele din trei cifre consecutive care apar de cele mai multe ori în cele n
numere.
Date de intrare
Fișierul de intrare 3cifre.in
conţine pe prima linie, separate printr-un spațiu, numărul natural n
, reprezentând numărul de numere și cerința (1
sau 2
). Pe cea de a doua linie sunt scrise cele n
numere naturale x[1] x[2] ... x[n]
, separate prin câte un spațiu.
Date de ieșire
Fișierul de ieșire 3cifre.out
va conține, pentru cerința 1
, pe prima linie patru valori naturale nrmin nrapmin x1min x1max
, separate prin câte un spațiu, reprezentând numărul minim de trei cifre care apare, numărul de apariții a acestuia, numărul în care apare prima dată, respectiv numărul în care apare ultima dată, iar pe linia a doua alte patru valori naturale nrmax nrapmax x2min x2max
, separate prin câte un spațiu, reprezentând numărul maxim de trei cifre care apare, numărul de apariții a acestuia, numărul în care apare prima dată, respectiv numărul în care apare ultima dată. Pentru cerința 2
, fișierul de ieșire va conține pe prima linie numărul maxim de apariții a numerelor din trei cifre consecutive care apar, iar pe linia a doua, separate prin câte un spațiu, numerele respective în ordine crescătoare.
Restricții și precizări
1 ≤ n ≤ 500000
100 ≤ x[i] ≤ 4294967295
Exemplul 1:
3cifre.in
7 1 415 5213 2017 666 12345678 10000013 13
3cifre.out
100 1 10000013 10000013 678 1 12345678 12345678
Exemplul 2:
3cifre.in
7 1 415 521013 206678 666 12345678 10101013 13
3cifre.out
101 4 521013 10101013 678 2 206678 12345678
Exemplul 3:
3cifre.in
7 2 1115 52113 2017 666 12345678 11101113 113
3cifre.out
3 111 113
Explicație
Se observă că atât 111
cât și 113
apar de câte 3
ori.
#include <bits/stdc++.h> using namespace std; ifstream cin("3cifre.in"); ofstream cout("3cifre.out"); long long int a[500000] , f[1002]; int main() { int n , cer; long long int mini = 1000 , maxi = 99 , nrmin1 = 0 , nrmin2 = 0 , nrmax1 = 0 , nrmax2 = 0 , fmin = 0 , fmax = 0; cin >> n >> cer; if(cer == 1) { for(int i = 0 ; i < n ; ++i) { cin >> a[i]; long long int x=a[i]; while(x > 99) { while((x/100)%10==0) x /= 10; if(x%1000 < mini) { mini=x%1000; nrmin1=a[i]; fmin=0; } if(x%1000 == mini) { fmin++; nrmin2=a[i]; } if(x%1000 > maxi) { maxi=x%1000; nrmax1=a[i]; fmax=0; } if(x%1000 == maxi) { fmax++; nrmax2=a[i]; } x /= 10; } } cout << mini << ' ' << fmin << ' ' << nrmin1 << ' ' << nrmin2 << endl; cout << maxi << ' ' << fmax << ' ' << nrmax1 << ' ' << nrmax2; } if(cer == 2) { for(int i = 0 ; i < n ; ++i) { cin >> a[i]; long long int x = a[i]; while(x > 99) { while((x/100)%10==0) x/=10; f[x%1000]++; x /= 10; } } maxi=0; for(int i = 100 ; i <= 999 ; ++i) if(f[i]>maxi)maxi=f[i]; cout << maxi << endl; for(int i = 100 ; i <= 999 ; ++i) { if(f[i] == maxi) cout << i << " "; } } return 0; }