fbpx

Problema #846 – Dubluri – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dă un șir de caractere ce conține doar litere mici ale alfabetului englez. Să se afișez cel mai lung subșir care apare de cel puțin două în șirul dat.

Date de intrare

Programul citește de la tastatură șirul dat.

Date de ieșire

Programul va afișa pe ecran cel mai lung subșir cu cel puțin două apariții.

Restricții și precizări

  • șirul dat are cel mult 255 caractere
  • dacă există mai multe subșiruri de lungime maximă care apar de cel puțin două ori, se va afișa primul în ordine lexicografică.
  • pentru toate datele de test există cel puțin un subșir din cel puțin două caractere, care se repetă

Exemplu

Intrare

cbddccdaaddccaaddbccbbdbddd

Ieșire

aadd

Explicație

Sirul aadd apare de două ori șirul dat. Niciun șir de lungime mai mare nu apare de cel puțin două ori. Să observăm că și șirul ddcc apare de două ori, dar ele este mai mare decât aadd, în ordinea lexicografică.

#include <bits/stdc++.h>


using namespace std;

char s[256], c[130], r[129];
int n, nrap;

int main()
{
    cin.getline(s, 256);
    n = strlen(s)/2;
    for(int i = 2; i <= n; i++)
    {
        for(int j = 0; s[j] != '\0'; j++)
        {
            strcpy(c,"");
            strncpy(c, s+j, i);

            c[i] = '\0';
            nrap = 0;

            char* p = strstr(s+j, c);

            while(p && nrap < 2)
            {
                nrap++;
                if(nrap > 1)
                {
                    if(strlen(c)>strlen(r))strncpy(r, c, i);
                    else if(strlen(c) == strlen(r) && strcmp(r, c)>0)strncpy(r, c, i);
                }
                p=strstr(p+i, c);
            }
        }
    }
    cout << r;
    return 0;
}
Comentarii

S-ar putea sa iti placa