Comentário OBI – Fase 3 – Falha de Segurança

por

Conhecimento prévio necessário:

Para esse problema, precisamos calcular quantas vezes uma determinada subsequência de caracteres, que corresponde a uma das senhas fornecidas na entrada, aparece em subsequências das demais senhas fornecidas. A partir disso, basta calcular esse resultado para cada uma das senhas da entrada, somá-los e não esquecer de subtrair ao final as próprias senhas que não podem ser consideradas como uma aparição delas em outras senhas. Veja o seguinte exemplo com apenas 3 senhas na entrada e suas subsenhas possíveis:

noic -> n ; o ; i ; c ; no ; oi ; ic ; noi ; oic ; noic . 

noi -> n ; o ; i ; no ; oi ; noi .

oi -> o ; i ; oi .

Assim, obtemos as seguintes opções e suas quantidades:

n=2 ; o=3 ; i=3 ; c=1 ; no=2; oi=3; ic=1; noi=2; oic=1; noic=1 .

A partir disso, se analisarmos a quantidade encontrada de cada senha na nossa lista de subsenhas, que é o que realmente importa na resposta final, temos: noic=1; noi=2 ; oi=3 .  

Aqui tem uma observação importante que se trata do que foi dito lá no começo da resolução, de subtrair n ao final, já que uma das subsenhas encontradas de cada senha já é a própria senha. Nesse caso, podemos subtrair 1 em cada resultado previamente ou ao final e obteremos: noic=0; noi=1 ; oi=2 . 

Se somarmos esses resultados, teremos res = 0+1+2 = 3, que é a resposta final, já que a senha noic pode acessar as duas demais senhas (noi oi) e a senha noi ainda pode acessar a senha oi.

Assim, o problema se resume em gerar todas as subsequências possíveis de cada senha com auxílio de um vector e de um set, armazenar a quantidade de cada subsequência em um map de string com int e ao final somar a quantidade encontrada para cada senha da entrada.

Segue o código comentado para melhor compreensão da solução: