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 șirs ≤ 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; }