-
Notifications
You must be signed in to change notification settings - Fork 0
/
3a-playlists.js
115 lines (90 loc) · 4.83 KB
/
3a-playlists.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
A. Плейлисты
Ограничение времени 1.5 секунд (фактическое использование на тестах – до 389ms)
Ограничение памяти 256Mb (фактическое использование на тестах – до 46.88Mb)
Ввод стандартный ввод или input.txt
Вывод стандартный вывод или output.txt
Костя успешно прошел собеседование и попал на стажировку в отдел разработки сервиса «Музыка». Конкретно ему поручили такое задание — научиться подбирать плейлист для группы друзей, родственников или коллег. При этом нужно подобрать такой плейлист, в который входят исключительно нравящиеся всем членам группы песни.
Костя очень хотел выполнить это задание быстро и качественно, но у него не получается. Помогите ему написать программу, которая составляет плейлист для группы людей.
Формат ввода
В первой строке расположено одно натуральное число n(1≤ n ≤ 2 ⋅ 10^5), где n – количество человек в группе.
В следующих 2 ⋅ n строках идет описание любимых плейлистов членов группы. По 2 строки на каждого участника.
В первой из этих 2-х строк расположено число k[i] — количество любимых треков i-го члена группы. В следующей строке расположено k[i] строк через пробел — названия любимых треков i-го участника группы.
Каждый трек в плейлисте задан в виде строки, все строки уникальны, сумма длин строк не превосходит 2 ⋅ 10^6. Строки содержат большие и маленькие латинские буквы и цифры.
Формат вывода
Выведите количество, а затем сам список песен через пробел — список треков, которые нравятся каждому участнику группы. Ответ необходимо отсортировать в лексикографическом порядке!
Пример 1
Ввод
1
2
GoGetIt Life
Вывод
2
GoGetIt Life
Пример 2
Ввод
2
2
Love Life
2
Life GoodDay
Вывод
1
Life
*/
const fs = require('fs');
const input = fs.readFileSync('input.txt', 'utf8').toString().trim().split('\n');
const peopleCount = parseInt(input[0]);
const songsLexicographicalMap = new Map();
const charCodeRanges = [[48, 57], [65, 90], [97, 122]];
for (const [start, end] of charCodeRanges) {
for (let i = start; i <= end; ++i) {
songsLexicographicalMap.set(String.fromCharCode(i), new Map());
}
}
let userCount = 0;
for (let i = 2; i < input.length; i += 2) {
++userCount;
const row = input[i].trim() + ' ';
const length = row.length;
let songName = '';
for (let pos = 0; pos < length; ++pos) {
if (row[pos] === ' ') {
const songsSegment = songsLexicographicalMap.get(songName[0]);
if (songsSegment) {
const songCount = songsSegment.get(songName);
if (songCount) {
if (songCount + 1 === userCount) {
songsSegment.set(songName, songCount + 1);
}
// else {
// songsSegment.delete(songName);
// }
} else if (userCount === 1) {
songsSegment.set(songName, 1);
}
}
songName = '';
} else {
songName += row[pos];
}
}
}
let favoriteSongsCount = 0;
let favoriteSongsList = '';
for (const [start, end] of charCodeRanges) {
for (let i = start; i <= end; ++i) {
const songsSegment = songsLexicographicalMap.get(String.fromCharCode(i));
const songsArray = new Array();
songsSegment.forEach((songCount, songName) => {
if (songCount === peopleCount) {
songsArray.push(songName);
}
});
if (songsArray.length !== 0) {
favoriteSongsCount += songsArray.length;
favoriteSongsList += songsArray.sort().join(' ') + ' ';
}
}
}
fs.writeFileSync('output.txt', `${favoriteSongsCount}\n${favoriteSongsList.trim()}`);