Cerința
Numim secvență încadrată a unui șir de numere naturale un subșir al acestuia, format din termeni aflați pe poziții consecutive în șirul dat, subșir care începe și se termină cu aceeași valoare. Lungimea secvenței este egală cu numărul de termeni ai acesteia.
Să se determine secvențele încadrate dintr-un șir, care au lungimea maximă.
Date de intrare
Fișierul de intrare secventaincadrata.in
conține cel puțin două și cel mult 10
6
numere naturale din intervalul [0,9]
, separate printr-un spațiu.
Date de ieșire
Fișierul de ieșire secventaincadrata.out
va conține pe prima linie numărul L
, reprezentând lungimea maximă a secvențelor încadrate, iar pe a doua linie a fișierului valoarea primului termen al fiecărei secvențe încadrate de lungime maximă, în ordine crescătoare și separate printr-un spațiu.
Restricții și precizări
- în șir există ce puțin doi termeni egali
- proiectați un algoritm eficient din punctul de vedere al timpului de executare și a memoriei utilizate
- se recomandă o soluție care să evite stocarea tuturor valorilor citite într-un tablou sau într-o altă structură de date similară
Exemplu
secventaincadrata.in
3 1 5 2 4 5 5 2 5 9 5 7 4 6 8 0 8
secventaincadrata.out
9 4 5
Explicație
Cele două secvențe încadrate de lungime maximă egală cu 9
, sunt 5 2 4 5 5 2 5 9 5
, respectiv 4 5 5 2 5 9 5 7 4
.
#include <bits/stdc++.h> using namespace std; ifstream cin("secventaincadrata.in"); ofstream cout("secventaincadrata.out"); #define Inf 0x3f3f3f int A[10], x, n, mx, lmax[10]; int main() { for (int i = 0; i < 10; i ++) A[i] = Inf; //cin >> n; int i = 1; while(cin >> x) { lmax[x] = max(i - A[x] + 1, lmax[x]); if (A[x] == Inf)A[x] = i; mx = max(lmax[x], mx); i++; } cout << mx << '\n'; for (int i = 0; i < 10; i ++) if (lmax[i] == mx) cout << i << ' '; return 0; }