3. Problema para apresentao e submisso no Sharif Judge: (Deve ser entregue at 23:59:59 do dia
01 de julho de 2014).
Existem diversos mecanismos para a compresso de dados, sendo alguns simples e outros mais
sofisticados. Estes algoritmos servem tanto para ocupar menos espao de armazenamento, como para
transmisso de dados via redes.
Um mtodo simplrio o de substituio de caracteres repetidos. Trata-se de um programa que
tenta transformar um fluxo de caracteres de entrada em um fluxo de sada de tamanho menor substituindo
as sequncias de caracteres longas que mais se repetem por sequncias mais curtas. Note que este
processo precisa ser reversvel para que, ao transmitir ou ler um dado comprimido ele possa ser
restaurado.
Veja um exemplo em que uma string de entrada comprimida de modo que pode ser restaurada:
Hoje eu comi um abacate muito gostoso. Ele cresceu em um abacateiro perto de minha casa. Comi o
abacate sem d e no sobrou nem o caroo do abacate.
Perceba que a palavra abacate se repete muitas vezes na frase acima. Podemos substituir abacate
por * nesta frase, fazendo com que ela fique mais curta. Veja como seria a sada do texto:
Hoje eu comi um * muito gostoso. Ele cresceu em um *iro perto de minha casa. Comi o * sem d e no
sobrou nem o caroo do *.
No entanto, para que a frase seja reversvel importante gravar a informao de que * abacate.
Perceba que abacateiro tambm pode ser convertido para *iro pela mesma regra.
O laboratrio desta semana consiste em ler um texto de entrada qualquer, procurar pelas
sequncias de caracteres que mais se repetem e converter as sequncias por smbolos. Note que no vale
a pena substituir sequncias que no se repetem, pois neste caso teramos de guardar mais espao para as
regras de converso que contm a sequncia original.
O programa deve procurar pelas sequncias que mais se repetem e substitu-las seguindo as regras
abaixo:
1) O texto de entrada ser uma sequncia de caracteres composta de nmeros, letras sem
acentos ou cedilhas, espaos, um enter no final e os sinais de pontuao '.', '!', '?' e ','.
2) As sequncias que se repetem devem e que geram economia de espao devem ser
substitudas pelos smbolos '@', '#', '$', '%', '&', '*', '~', '+', '=', '^' e '`' nesta ordem,
utilizando um smbolo por substituio.
3) Depois de utilizar o caractere '`' na substituio, o compresso finalizada.
4) Cada substituio ter uma regra de converso no formato: Cstring, onde 'C' um dos
smbolos de substituio da regra 2) e string a sequncia substituda.
5) Quando uma sequncia de caracteres X que possui n caracteres (n > 0) e aparece r vezes (r
> 1) substituda, o ganho de espao de ( n 1 ) * ( r 1 ) 2.
6) Voc deve buscar a sequncia de caracteres que pouparia mais espao se fosse substituda.
Exemplo: Se a sequncia adomiaul se repetir 3 vezes e a sequncia miau se repetir 20
vezes, ento a adomiaul pouparia 12 caracteres e a sequncia miau pouparia 55
caracteres. Assim, a sequncia miau deve ser substituda primeiro.
7) Caso haja mais sequncias que poupem o mximo de espao deve ser escolhida a de
menor nmero de caracteres e a que aparece mais prxima do incio da string.
8) Guarde as regras de converso em uma string no formato: @string1#string2$string3...,
onde string1 a primeira string substituda, string2 a segunda e assim sucessivamente.
Exemplos:
Entrada 1:
macacomacacomacaco.
Sada 1:
Inicial:21.
Final:14.
Ganho:33.33%.
Resultado:@@@.
Regra:"@macaco".
Entrada 2:
OcaciqueArariboiaviveunaguanabaraegostavadeararasecanarios.
Sada 2:
Inicial:70.
Final:67.
Ganho:4.29%.
Resultado:Ocaciqu#Ar@iboi$viveun$guanab@$#gostav$d#@@as#can@ios.
Regra:"@ar#e$a".
Entrada 5:
NaoconfundaOrnitorrincocomOtorrinolaringologista,Ornitorrincocom
ornitologista,OrnitologistacomOtorrinolaringologista,Porqueornitorrinco
Eornitorrinco,OrnitologistaeornitologistaEotorrinolaringologistae
Otorrinolaringologista.
Sada 5:
Inicial:244.
Final:118.
Ganho:51.64%.
Resultado:Naoconfunda&$*&$%o#,&#*Porque~$E~$,&#e~#E~@e&@.
Regra:"@torrinolaringologista#rnitologista$rnitorrinco%com&O*%O@,~o".