Pesquisar este blog

Livros Recomendados

sábado, 30 de janeiro de 2021

URI (BEECROWD) - 1257 - Array Hash - Strings - C e C++

Fala pessoal! Nesse post trago um problema de strings do Beecrowd, o "Array hash". Confiram!

Plataforma: URI (BEECROWD)

Problema
1257

Enunciado:
Você terá como uma entrada várias linhas, cada uma com uma string. O valor de cada caracter é computado como segue: Valor = (Posição no alfabeto) + (Elemento de entrada) + (Posição do elemento) Todas posições são baseadas em zero. 'A' tem posição 0 no alfabeto, 'B' tem posição 1 no alfabeto, ... O cálculo de hash retornado é a soma de todos os caracteres da entrada. Por exemplo, se a entrada for: CBA DDD então cada caractere deverá ser computado como segue: 2 = 2 + 0 + 0 : 'C' no elemento 0 posição 0 2 = 1 + 0 + 1 : 'B' no elemento 0 posição 1 2 = 0 + 0 + 2 : 'A' no elemento 0 posição 2 4 = 3 + 1 + 0 : 'D' no elemento 1 posição 0 5 = 3 + 1 + 1 : 'D' no elemento 1 posição 1 6 = 3 + 1 + 2 : 'D' no elemento 1 posição 2 O cálculo final de hash será 2+2+2+4+5+6 = 21.

Linguagens: C e C++

Solução:

Considerando a tabela asc, todos os caracteres maiúsculos iniciam a partir da posição 65 (letra "A"). Então bastava converter cada caractere para inteiro subtraindo 65 e adicionando i e j, como pede o enunciado, e acumular os valores em uma variável acumuladora.

Código em C:

#include <stdio.h>
#include <string.h>

int main() {
    
    int n, palavras, acumulador, i, j;
    char texto[51];
    scanf("%d", &n);
    
    while (n--) {
        
        scanf("%d", &palavras);
        acumulador = 0;
        
        for (i = 0; i < palavras; i++) {
            
            scanf("%s", &texto);
            
            for (j = 0; j < strlen(texto); j++)
                acumulador += (int) texto[j] - 65 + i + j;
            
        }
        
        printf("%d\n", acumulador);
    }

    return 0;
}

Código em C++:

#include <iostream>

using namespace std;

int main() {
    
    int n, palavras, acumulador;
    string texto;
    cin >> n;
    
    while (n--) {
        
        cin >> palavras;
        acumulador = 0;
        int tam;
        
        for (int i = 0; i < palavras; i++) {
            
            cin >> texto;
            tam = texto.size();
            
            for (int j = 0; j < tam; j++)
                acumulador += (int) texto[j] - 65 + i + j;
            
        }
        
        cout << acumulador << endl;
        
    }

    return 0;
}


Solução alternativa em C++:

Nessa solução o programa percorre a lista de strings, calculando a fórmula proposta no exercício. Ao final, o somatório é impresso. Aqui usei diretamente o caractere 'A' no cálculo, não foi necessária a conversão para inteiro e nem o uso do valor inteiro do A (65).


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <map>
 
using namespace std;

int main() {
 int n,m;
 cin >> n;
 while(n--){
  cin >> m;
  long long sum = 0;
  for(int el=0; el<m; el++){
   string input_str;
   cin >> input_str;
   for(int pos=0;pos<input_str.length();pos++){
    sum += input_str[pos] - 'A' + el + pos;
   }
  }
  cout << sum << endl;
 }
    return 0;
}

Nenhum comentário:

Postar um comentário

Postagem em destaque

URI (BEECROWD) - 2158 - Helping Uncle Cláudio (Ajudando o Tio Cláudio) - Matemática - C, C++ e Haskell

Buenas! Estou aqui mais uma vez para resolver um problema de Matemática! Agora tenho resolvido alguns dessa categoria, pra que vocês possam ...

Postagens mais visitadas