Maximização de XOR em Pares Fortes e Identificação de Acessos Frequentes por Janela de Tempo

Maximização de XOR em Pares Fortes

Dado um conjunto de inteiros, um par é definido como "forte" se a diferença absoluta entre seus elementos for menor ou igual ao menor valor do par, ou seja, |x - y| <= min(x, y). O objetivo é encontrar o valor máximo da operação de bit a bit XOR (OU exclusivo) entre quaisquer dois elementos que formem um par forte. É permitido utilizar o mesmo elemento duas vezes para formar o par.

Uma abordagem direta para resovler este problema é verificar todas as combinações possíveis de pares dentro do array. Para cada par, validamos a condição de par forte e, caso seja verdadeira, comparamos e atualizamos o valor máximo de XOR encontrado até o momento.

def max_xor_pares_fortes(valores):
    max_xor = 0
    qtd = len(valores)
    for i in range(qtd):
        for j in range(i, qtd):
            x, y = valores[i], valores[j]
            if abs(x - y) <= min(x, y):
                max_xor = max(max_xor, x ^ y)
    return max_xor

Identificação de Funcionários com Acessos Frequentes

Com base em um registro de acessos contendo nomes de funcionários e seus respectivos horários (no formato "HHMM"), o desafio é identificar aqueles que acessaram o sistema três ou mais vezes dentro de uma janela de tempo estritamente menor que uma hora. Na representação numérica inteira do horário, isso significa que a diferença entre o horário mais tardio e o mais antigo da janela deve ser inferior a 100.

A estratégia eficiente consiste em agrupar os horários por funcionário e ordená-los cronologicamente. Um erro comum ao implementar uma janela deslizante convencional é reposicionar o ponteiro de início da janela de forma agressiva. Por exemplo, ao avaliar os horários 0010, 0040 e 0120, ao detectar que 0120 excede a janela de 0010, reposicionar o início para 0120 ignora que 0040 e 0120 ainda formam uma janela válida.

Para evitar essa armadilha lógica, a solução ideal é verificar janelas fixas de tamanho 3. Se o terceiro acesso consecutivo na lista ordenada estiver a menos de 100 uniaddes de tempo do primeiro acesso dessa sequência, o funcionário é classificado como de alto acesso.

from collections import defaultdict

def encontrar_acessos_elevados(registros):
    historico = defaultdict(list)
    for usuario, hora_str in registros:
        historico[usuario].append(int(hora_str))
        
    alto_acesso = []
    
    for usuario, horas in historico.items():
        if len(horas) < 3:
            continue
            
        horas.sort()
        for i in range(len(horas) - 2):
            if horas[i + 2] - horas[i] < 100:
                alto_acesso.append(usuario)
                break
                
    return alto_acesso

Tags: Algoritmos Python XOR sliding-window estruturas-de-dados

Publicado em 9-1 18:03