fbpx

Problema #1562 – Abba – Rezolvari PBInfo

de Mihai-Alexandru

Pentru transmiterea unui mesaj format exclusiv din litere mici ale alfabetului englez, se utilizează un aparat electronic care are anumite limitări tehnice. Astfel, el poate transmite mesaje formate doar din litere vecine din alfabet sau formate din aceeași literă. De exemplu mesajul: defffedcbab poate fi transmis, iar mesajul accded nu poate fi transmis deoarece literele a și c nu sunt vecine în alfabetul englez.

Din acest motiv mesajul ce urmează să fie transmis trebuie codificat pentru a fi compatibil cu aparatul.

Pentru codificare, mesajul este prelucrat în etape până satisface limitările aparatului. O etapă de prelucrare presupune inserarea între fiecare două litere vecine ale mesajului a literei mijlocii. Litera mijlocie este acea litera situată la jumătatea secvenței din alfabet ce are capete literele vecine. Dacă nu există se ia în considerare litera mai mică.

Literele vecine Litera mijlocie Explicații
dd d
ae c Secvența abcde are litera c la mijloc
af c Secvența abcdef are la mijloc literele cd, din care alegem c
ha d Secvența este tratată la fel ca și ah deci abcdefgh

Cerința

Determinați numărul de etape de prelucrare necesare pentru codificarea mesajului și lungimea finală a mesajului.

Date de intrare

Fișierul de intrare abba.in conține pe prima linie un șir s de litere mici ale alfabetului englez.

Date de ieșire

Fișierul de ieșire abba.out va conţine o singură linie cu două numere naturale separate printr-un spațiu, care reprezintă numărul de etape de prelucrare și lungimea finală a mesajului.

Restricții și precizări

  • 2 ≤ lungime șir s ≤ 50000
  • Mesajul va suferi cel puțin o etapă de prelucrare.

Exemplu

abba.in

oli

abba.out

2 9

Explicație

În prima etapă între ol se introduce m și între li se introduce j. Mesajul devine omlji.

În etapa a doua se inserează literele n l k i și se obține onmllkjii care are 9 litere.

Nu se continuă mai departe prelucrarea mesajului, el poate fi transmis de aparatul electronic fiindcă oricare două litere alăturate în mesaj sunt fie identice fie vecine în alfabet.

#include <bits/stdc++.h>


using namespace std;

ifstream cin("abba.in");
ofstream cout("abba.out");

char s[50001];

int p2(int n)
{
    if(n == 1)
        return 2;
    else
        return 2 * p2(n-1);
}

int log2n(int n)
{
    int cnt = 0;
    while(n)
        n/=2 , cnt++;
    return cnt;
}

int main()
{
    cin >> s;
    int i = 1;
    int max = 0;
    while(s[i])
    {
        if(abs((int)s[i] - (int)s[i-1]) - 1 > max)
            max = abs((int)s[i] - (int)s[i-1]) - 1;
        i++;
    }
    cout << log2n(max) << ' ' << i + (i-1)*(p2(log2n(max))-1);
    return 0;
}
Comentarii

S-ar putea sa iti placa