Problema
El patrón observer permite que los objetos se suscriban a un sujeto y reciban un aviso cada vez que ocurre algo. Aquí, las personas se suscriben a temas y cada evento publicado llega a todos los suscriptores de su tema.
Cada suscripción es <person> <topic>. Una suscripción repetida no tiene efecto adicional. Después, cada evento de events es un nombre de tema: cada suscriptor de ese tema recibe una notificación. Los eventos de temas que nadie sigue se descartan.
Implementa event_subscribers(subscriptions, events).
Entrada
subscriptions: Cadenas "<person> <topic>" (los nombres no tienen espacios).
events: Nombres de temas, en orden de publicación.
Salida
Devuelve "<person>:<count>" para cada persona con al menos una suscripción, ordenadas por nombre (orden ordinal de caracteres).
Restricciones
1 ≤ número de suscripciones ≤ 10,000
0 ≤ número de eventos ≤ 100,000
Ejemplos
Entrada:
events = ["news", "sports", "weather"]
subscriptions = ["bob sports", "alice news", "alice sports"]
Salida esperada:
expected = ["alice:2", "bob:1"]
Entrada:
std::vector<std::string> events = {"news", "sports", "weather"};
std::vector<std::string> subscriptions = {"bob sports", "alice news", "alice sports"};
Salida esperada:
std::vector<std::string> expected = {"alice:2", "bob:1"};
Entrada:
string[] events = new string[] {"news", "sports", "weather"};
string[] subscriptions = new string[] {"bob sports", "alice news", "alice sports"};
Salida esperada:
string[] expected = new string[] {"alice:2", "bob:1"};
Explicación
alice sigue news y sports, así que recibe ambos eventos; bob solo recibe sports; nadie sigue weather: ["alice:2", "bob:1"].
Entrada:
events = []
subscriptions = ["zoe tech", "zoe tech"]
Salida esperada:
expected = ["zoe:0"]
Entrada:
std::vector<std::string> events = {};
std::vector<std::string> subscriptions = {"zoe tech", "zoe tech"};
Salida esperada:
std::vector<std::string> expected = {"zoe:0"};
Entrada:
string[] events = new string[] {};
string[] subscriptions = new string[] {"zoe tech", "zoe tech"};
Salida esperada:
string[] expected = new string[] {"zoe:0"};
Explicación
La suscripción repetida cuenta una sola vez y no se publicó ningún evento: ["zoe:0"].
Cómo abordarlo
Inténtalo primero por tu cuenta y luego abre las pistas una a una.
Pista 1
Agrupa a los suscriptores por tema para que cada evento encuentre rápido a su público.
Pista 2
Usa un conjunto por tema para que una suscripción repetida cuente una sola vez.
Pista 3
Todo el que se suscribió aparece en el resultado, aunque tenga cero notificaciones.
Complejidad esperada
tiempo O(suscripciones + eventos × suscriptores por tema), espacio extra O(suscripciones)
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.