using System.Collections.Generic;
public Entry(int t, string u, string r)
static Tuple<string, int> getHighest(Dictionary<string, int> dict)
int maxSoFar = Int32.MinValue;
foreach (string key in dict.Keys)
if (dict[key] > maxSoFar)
return Tuple.Create(maxKeySoFar, maxSoFar);
static Tuple<string, int> calculate(string[][] logs)
Dictionary<string, int> dict = new Dictionary<string, int>();
List<Entry> entries = new List<Entry>();
foreach (var log in logs)
Entry entry = new Entry(int.Parse(log[0]), log[1], log[2]);
entries = entries.OrderBy(e => e.timestamp).ToList();
if (!dict.ContainsKey(entries[low].resource))
dict.Add(entries[low].resource, 0);
dict[entries[low].resource] += 1;
while (high + 1 < n && entries[high + 1].timestamp <= entries[low].timestamp + 300)
if (!dict.ContainsKey(entries[high].resource))
dict.Add(entries[high].resource, 0);
dict[entries[high].resource] += 1;
int totalMaxSoFar = Int32.MinValue;
string totalMaxKeySoFar = "";
Tuple<string, int> result = getHighest(dict);
if (result.Item2 > totalMaxSoFar)
totalMaxKeySoFar = result.Item1;
totalMaxSoFar = result.Item2;
dict[entries[low].resource] -= 1;
while (high + 1 < n && entries[high + 1].timestamp <= entries[low].timestamp + 300)
if (!dict.ContainsKey(entries[high].resource))
dict.Add(entries[high].resource, 0);
dict[entries[high].resource] += 1;
result = getHighest(dict);
if (result.Item2 > totalMaxSoFar)
totalMaxKeySoFar = result.Item1;
totalMaxSoFar = result.Item2;
return Tuple.Create(totalMaxKeySoFar, totalMaxSoFar);
public static void Main(String[] args)
string[][] logs1 = new string[][]{new[]{"58523", "user_1", "resource_1"}, new[]{"62314", "user_2", "resource_2"}, new[]{"54001", "user_1", "resource_3"}, new[]{"200", "user_6", "resource_5"}, new[]{"215", "user_6", "resource_4"}, new[]{"54060", "user_2", "resource_3"}, new[]{"53760", "user_3", "resource_3"}, new[]{"58522", "user_22", "resource_1"}, new[]{"53651", "user_5", "resource_3"}, new[]{"2", "user_6", "resource_1"}, new[]{"100", "user_6", "resource_6"}, new[]{"400", "user_7", "resource_2"}, new[]{"100", "user_8", "resource_6"}, new[]{"54359", "user_1", "resource_3"}, };
string[][] logs2 = new string[][]{
new[]{"300", "user_1", "resource_3"},
new[]{"599", "user_1", "resource_3"},
new[]{"900", "user_1", "resource_3"},
new[]{"1199", "user_1", "resource_3"},
new[]{"1200", "user_1", "resource_3"},
new[]{"1201", "user_1", "resource_3"},
new[]{"1202", "user_1", "resource_3"}};
string[][] logs3 = new string[][]{new[]{"300", "user_10", "resource_5"}};
var result = calculate(logs1);
Console.WriteLine("logs 1 {0}: {1}", result.Item1, result.Item2);
result = calculate(logs2);
Console.WriteLine("logs 2 {0}: {1}", result.Item1, result.Item2);
result = calculate(logs3);
Console.WriteLine("logs 3 {0}: {1}", result.Item1, result.Item2);