All challenges
Easy 0 solved 0% acceptance

Event Subscribers

Deliver events to the subscribers of each topic, observer style, and count what everyone receives.

What you'll learn

  • Map topics to the people who follow them
  • Notify every subscriber of an event
  • Ignore duplicate subscriptions with a set

Problem

The observer pattern lets objects subscribe to a subject and get notified whenever something happens. Here, people subscribe to topics and every published event goes to everyone subscribed to its topic.

Each subscription is <person> <topic>. A repeated subscription has no extra effect. Then each event in events is a topic name: every subscriber of that topic receives one notification. Events on topics nobody follows are dropped.

Implement event_subscribers(subscriptions, events).

Input

subscriptions: "<person> <topic>" strings (names have no spaces).

events: Topic names, in publishing order.

Output

Return "<person>:<count>" for every person who has at least one subscription, sorted by name (ordinal character order).

Constraints

1 ≤ number of subscriptions ≤ 10,000

0 ≤ number of events ≤ 100,000

Examples

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

Expected output:
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"};

Expected output:
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"};

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

Explanation

alice follows news and sports, so she gets both events; bob only gets sports; nobody follows weather: ["alice:2", "bob:1"].

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

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

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

Expected output:
string[] expected = new string[] {"zoe:0"};

Explanation

The repeated subscription counts once, and no events were published: ["zoe:0"].

How to approach it

Try on your own first, then open one hint at a time.

Hint 1

Group subscribers by topic so each event finds its audience quickly.

Hint 2

Use a set per topic so a repeated subscription counts once.

Hint 3

Everyone who subscribed appears in the result, even with zero notifications.

Expected complexity

O(subscriptions + events × subscribers per topic) time, O(subscriptions) extra space

References

This challenge is adapted for CodeUtility. Follow the statement and constraints above.

Learn from others

Community solutions

No published solutions yet. Solve this challenge to share the first one.