Tutte le sfide
Facile 0 risolte 0% di accettazione

Iscritti agli eventi

Consegna gli eventi agli iscritti di ogni argomento, in stile observer, e conta cosa riceve ciascuno.

Cosa imparerai

  • Associare ogni argomento a chi lo segue
  • Notificare tutti gli iscritti di un evento
  • Ignorare le iscrizioni duplicate con un set

Problema

Il pattern observer permette agli oggetti di iscriversi a un soggetto e di ricevere una notifica ogni volta che succede qualcosa. Qui le persone si iscrivono ad argomenti e ogni evento pubblicato arriva a tutti gli iscritti del suo argomento.

Ogni iscrizione è <person> <topic>. Un'iscrizione ripetuta non ha effetti aggiuntivi. Poi ogni evento in events è il nome di un argomento: ogni iscritto a quell'argomento riceve una notifica. Gli eventi su argomenti che nessuno segue vengono scartati.

Implementa event_subscribers(subscriptions, events).

Input

subscriptions: Stringhe "<person> <topic>" (i nomi non contengono spazi).

events: Nomi di argomenti, in ordine di pubblicazione.

Output

Restituisci "<person>:<count>" per ogni persona con almeno un'iscrizione, ordinate per nome (ordine ordinale dei caratteri).

Vincoli

1 ≤ numero di iscrizioni ≤ 10,000

0 ≤ numero di eventi ≤ 100,000

Esempi

Esempio 1
Input:
events = ["news", "sports", "weather"]
subscriptions = ["bob sports", "alice news", "alice sports"]

Output atteso:
expected = ["alice:2", "bob:1"]
Input:
std::vector<std::string> events = {"news", "sports", "weather"};
std::vector<std::string> subscriptions = {"bob sports", "alice news", "alice sports"};

Output atteso:
std::vector<std::string> expected = {"alice:2", "bob:1"};
Input:
string[] events = new string[] {"news", "sports", "weather"};
string[] subscriptions = new string[] {"bob sports", "alice news", "alice sports"};

Output atteso:
string[] expected = new string[] {"alice:2", "bob:1"};

Spiegazione

alice segue news e sports, quindi riceve entrambi gli eventi; bob riceve solo sports; nessuno segue weather: ["alice:2", "bob:1"].

Esempio 2
Input:
events = []
subscriptions = ["zoe tech", "zoe tech"]

Output atteso:
expected = ["zoe:0"]
Input:
std::vector<std::string> events = {};
std::vector<std::string> subscriptions = {"zoe tech", "zoe tech"};

Output atteso:
std::vector<std::string> expected = {"zoe:0"};
Input:
string[] events = new string[] {};
string[] subscriptions = new string[] {"zoe tech", "zoe tech"};

Output atteso:
string[] expected = new string[] {"zoe:0"};

Spiegazione

L'iscrizione ripetuta conta una volta sola e non è stato pubblicato alcun evento: ["zoe:0"].

Come affrontarlo

Prova prima da solo, poi apri un suggerimento alla volta.

Suggerimento 1

Raggruppa gli iscritti per argomento così ogni evento trova subito il suo pubblico.

Suggerimento 2

Usa un set per argomento, così un'iscrizione ripetuta conta una volta sola.

Suggerimento 3

Chiunque si sia iscritto compare nel risultato, anche con zero notifiche.

Complessità attesa

tempo O(iscrizioni + eventi × iscritti per argomento), spazio aggiuntivo O(iscrizioni)

Riferimenti

Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.

Impara dagli altri

Soluzioni della community

Nessuna soluzione pubblicata. Risolvi questa sfida per condividere la prima.