fbpx

Problema #2533 – SecventaIncadrata – Rezolvari PBInfo

de Mihai-Alexandru

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 106 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;
}
Comentarii

S-ar putea sa iti placa