# PBinfo #1867 – cuvant2 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Alin este un elev pasionat de forma cuvintelor. Știe că un cuvânt care, citit atât de la stânga la dreapta cât și de la dreapta la stânga are aceeași formă, este de tip palindrom. Cuvântul capac este de tip palindrom.

Oricare cuvânt care nu este de tip palindrom se poate separa în mai multe părți care, fiecare, să fie de tip palindrom. Cuvântul capacele se poate separa în capac și ele care, ambele, sunt de tip palindrom.

Cerința
Se dă un cuvânt. Ajutați-l pe Alin să determine:

a) numărul minim de secvențe de tip palindrom în care poate fi separat cuvântul dat;

b) care este lungimea celei mai mari secvențe de tip palindrom.

Date de intrare
Din fișierul cuvant2.in se citește un cuvânt.

Date de ieșire
Fișierul de ieșire cuvant2.out conține o singură linie pe care vor fi scrise cele două valori determinate, separate printr-un singur spațiu.

Restricții și precizări

cuvântul citit are cel mult 255 de caractere litere mici ale alfabetului englez

Exemplul 1:
cuvant2.in

divid
cuvant2.out

1 5
Explicație
1 cuvant de tip palindrom, lungimea maximă este 5

Exemplul 2:
cuvant2.in

asffsaghjh
cuvant2.out

3 6
Explicație
3 cuvinte de tip palindrom, lungimea maximă este 6

Exemplul 3:
cuvant2.in

fgfhtyuytqw
cuvant2.out

5 5
Explicație
5 cuvinte de tip palindrom, lungimea maximă este 5

## Cod sursă C++

```cpp
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin("cuvant2.in");
ofstream fout("cuvant2.out");
char cuv[256];
int sol,mx=0;
bool e_palindrom(int st, int dr)
{
    while(st<dr)
    {
        if(cuv[st]!=cuv[dr])
            return false;
        st++;
        dr--;
    }
    return true;
}
int main()
{
    fin>>cuv;
    int L=strlen(cuv);
    fin.close();
    int i,j,s[256],nrmin;
    for(i=0;i<L;i++)
        if(e_palindrom(0,i))
        {
            s[i]=1;
            mx=max(mx,i+1);;
        }
        else
        {
            nrmin=257;
            for(j=0;j<i;++j)
                if(e_palindrom(j+1,i) && s[j]<nrmin)
                {
                    nrmin=s[j];
                    mx=max(mx,i-j);
                }
            s[i]=nrmin+1;
        }
    sol=s[L-1];
    fout<<sol<<' '<<mx;
    fout.close();
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1867)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1867/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1867/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
