| //### Desafio - Conjuntos bons ou ruins? |
| Nesse algoritmo você deverá descobrir se um conjunto de palavras é bom ou ruim. Por definição, um conjunto é bom quando nenhuma palavra |
| desse conjunto é um prefixo de outra palavra. Caso contrário, é considerado um conjunto ruim. |
| Por exemplo, {dbc, dae, dbcde} é um conjunto ruim, pois dbc é um prefixo de dbcde. Quando duas palavras são idênticas, definimos como uma |
| sendo prefixo da outra. |
| //### Entrada |
| A entrada contém vários casos de teste. A primeira linha de cada caso de teste terá um inteiro N (1 ≤ N ≤ 10⁵), que representa a quantidade |
| de palavras no conjunto. Segue então N linhas, cada uma tendo uma palavra de no máximo 100 letras minúsculas. A entrada termina quando |
| N = 0 e não deve ser processada. |
| //### Saída |
| Para cada caso de teste, você deverá imprimir "Conjunto Bom", ou "Conjunto Ruim", conforme explicado acima. |
| |---------------------------------------| |
| | Exemplo de Entrada | Exemplo de Saída | |
| |--------------------|------------------| |
| | 3 | Conjunto Ruim | |
| | abc | | |
| | dae | | |
| | abcde | | |
| |--------------------|------------------| |
| | 2 | Conjunto Bom | |
| | abc | | |
| | def | | |
| | 0 | | |
| |---------------------------------------| |
| */ |
|
|
| //Código do desafio: |
| const inputs = [ |
| '3', |
| 'abc', |
| 'dae', |
| 'abcde', |
| '2', |
| 'abc', |
| 'def', |
| '3', |
| 'dbc', |
| 'dae', |
| 'dbcde', |
| '3', |
| 'abcd', |
| 'def', |
| 'abcd', |
| '0' |
| ] |
| let i = 0; //para uso local |
|
|
| let N; |
| const limit = Math.pow(10, 5); |
| let words, isBad; |
|
|
| while (true) { |
| words = [] |
| // N = parseInt(gets()) //para uso na DIO |
| N = parseInt(inputs[i]) //para uso local |
|
|
| if (N === 0 || (N < 1 || N > limit)) break; |
|
|
| for (let index = 0; index < N; index++) { |
| // word = gets() //para uso na DIO |
| word = inputs[++i] //para uso local |
|
|
| if (!(/^[a-z]{1,100}$/g.test(word))) continue; //skip invalid word |
|
|
| words = [...words, word] |
| } |
|
|
| isBad = words.some((currentWord, i, words) => { |
| const pattern = new RegExp(`^(${currentWord}).+`) |
|
|
| for (const word of words) { |
| if (pattern.test(word)) return true |
| } |
|
|
| const same = words.reduce((total, w) => { |
| total += w === currentWord ? 1 : 0 |
| return total |
| }, 0) |
|
|
| return same > 1; |
| }) |
|
|
| console.log(isBad ? 'Conjunto Ruim' : 'Conjunto Bom'); |
| i++ //para uso local |
| /* |
Nenhum comentário:
Postar um comentário