Pesquisar este blog

Livros Recomendados

Mostrando postagens com marcador 1257. Mostrar todas as postagens
Mostrando postagens com marcador 1257. Mostrar todas as postagens

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;
}

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