==========
Questão 01
==========

Arquivo fonte: L3Q1.java | L3Q1.c | L3Q1.cpp
Arquivo de entrada: L3Q1.in
Arquivo de saída: L3Q1.out

O arquivo de entrada consiste em vários conjuntos de dados.
Cada conjunto de dados corresponde a um inteiro (0 < K < 10) na primeira linha e de várias outras linhas.
Cada linha contém uma string S (de tamanho K). S é formada apenas por caracteres 'a', 'c', 't', 'g' em minúsculo.
O conjunto de dados em questão acabará com a string "0".
O arquivo de entrada acabará no EndOfFile.

Imprima para cada conjunto de entradas a string "Conjunto #n" (n é o conjunto atual), seguida de 4^K linhas.
Cada linha deverá ter o valor da posição HASH[i] 0 <= i < 4^K (se o valor não foi definido
imprimia -1). Em seguida imprimia uma linha em branco.

NOTA: As strings deverão ser mapeadas de forma a satisfazer a seguinte regra:
                      Para todo i1, i2 (índices no array): se i1 < i2 então s1 é lexicograficamente menor que s2
            Isso significa que a sua função que mapeia as strings em um índice, deve gerar um índice menor para aquela string
            que for lexicograficamente (ordem do dicionário) menor que a outra.

            Exemplo para K = 2
            f("aa") = 0
            f("ac") = 1
            f("ag") = 2
            f("at") = 3
            f("ca") = 4
            f("cc") = 5
            f("cg") = 6
            f("ct") = 7
            f("ga") = 8
            f("gc") = 9
            f("gg") = 10
            f("gt") = 11
            f("ta") = 12
            f("tc") = 13
            f("tg") = 14
            f("tt") = 15

OBS:

Entrada exemplo:

2
tg
ga
cg
gt
0

1
c
t
0
Saída exemplo correspondente à entrada acima:
Conjunto #1
-1
-1
-1
-1
-1
-1
cg
-1
ga
-1
-1
gt
-1
-1
tg
-1

Conjunto #2
-1
c
-1
t

==========
Questão 2 
==========
Arquivo fonte: L3Q2.{c | cpp | java}
Arquivo de entrada: L3Q2.in
Arquivo de saída: L3Q2.out

O arquivo de entrada consistirá de vários grupos de dados. Cada grupo terá um inteiro n seguido de n operações a serem feitas na hash table, uma por linha. As operações podem ser: O arquivo termina com um grupo onde n = 0. Este grupo não deve ser processado.

Sua hash table deverá ter tamanho 1024 (h = 1024). A função de hash a ser utilizada é a da pág. 282, item 8, do Sara Baase:

hash(k) = (a k) mod h,   onde   a = (8 ëh/23û) + 5

A função de double hash encontra-se na seção 6.5.2 do mesmo:

doubleHash(k, pos) = (pos + desloc) mod h,   onde desloc(k) = 2k + 1 e pos é a posição da última colisão.

A função de saída para cada grupo será mostrada de acordo com a saída exemplo.
A saída exemplo cobre TODOS os casos, logo não será necessário tratar qualquer outro caso.

Entrada exemplo:

4 
i 10
i 20
b 10
b 150

3 
i 3
i 1027
b 1027

5
i 7
i 1036
b 7
b 12
i 12

0
Saída da entrada acima:
Conjunto #1
10 inserido em 498
20 inserido em 996
10 encontrado em 498
150 inexistente

Conjunto #2
3 inserido em 47
1027 inserido em 54
1027 encontrado em 54

Conjunto #3
7 inserido em 451
1036 inserido em 188
7 encontrado em 451
12 inexistente
12 inserido em 213
obs.:

==========
Questão 3 
==========
Arquivo fonte: L3Q3.{c | cpp | java}
Arquivo de entrada: L3Q3.in
Arquivo de saída: L3Q3.out

O arquivo de entrada consistirá de vários conjuntos de dados. Cada conjunto é composto por duas linhas. A primeira contém o valor n (n > 0), correspondente ao tamanho do heap. A segunda linha contém n elementos inteiros que formarão o heap, em que o maior elemento fica na raiz.

O fim dos conjuntos é indicado pelo fim do arquivo.

Para cada conjunto de entrada, o arquivo de saída deve conter n linhas. A primeira deve conter o número do conjunto e a segunda a seqüência de elementos do heap completo.

Em seguida, o elemento na raiz do heap deve ser removido, e a nova configuração do array (elementos restantes) deve ser impressa. O processo deve ser repetido até que o heap tenha apenas um elemento.

Atenção:
Entrada Exemplo:
5
1 2 3 4 5

10
10 9 8 6 5 4 7 2 3 1

4
2 12 12 5
Saída correspondente à entrada acima:
Conjunto #1
5 4 3 1 2
4 2 3 1
3 2 1
2 1
1

Conjunto #2
10 9 8 6 5 4 7 2 3 1
9 6 8 3 5 4 7 2 1
8 6 7 3 5 4 1 2
7 6 4 3 5 2 1
6 5 4 3 1 2
5 3 4 2 1
4 3 1 2
3 2 1
2 1
1

Conjunto #3
12 5 12 2
12 5 2
5 2
2