Rezolvare completă PbInfo #2533 SecventaIncadrata

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.

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 SecventaIncadrata:

#include <iostream>
#include <fstream>

using namespace std;
ifstream f("secventaincadrata.in");
ofstream g("secventaincadrata.out");
int ap1[10], ap2[10], n, i, x, k, lmax;
int main()
{
    n = 0;
    while (f >> x)
    {
        n++;
        if (ap1[x] == 0) ap1[x] = n;
        else ap2[x] = n;
    }
    lmax = 0;
    for (i = 0; i <= 9; i++)
        if (ap2[i] - ap1[i] + 1 > lmax) lmax = ap2[i] - ap1[i] + 1;
    g << lmax <<'\n';
    for (i = 0; i <= 9; i++)
        if (ap2[i] - ap1[i] + 1 == lmax) g << i <<' ';
    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 Adresa de email.

Rezolvarea problemei #2533 SecventaIncadrata

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2533 SecventaIncadrata 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!