-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathP902.cpp
51 lines (48 loc) · 1.06 KB
/
P902.cpp
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
/*
26 characters => 5 bit.
*/
string tos(int N, ULL best) {
char cc[11];
FORI(N) {
cc[N-i-1] = (char)('a'+(best & 31));
best >>= 5;
}
cc[N] = '\0';
return string(cc);
}
int main() {
string s;
int N;
while(cin >> N >> s) {
if(N > (int)s.size())
die(); // Not possible. Doesn't make sense.
map<ULL,int> m;
ULL curr = 0;
ULL mask = 0;
FORI(N) {
curr = (curr << 5) + (s[i]-'a');
mask = (mask << 5) + 31; // Fill with 1's.
}
m.insert(make_pair(curr, 1));
ULL best = curr;
int bestCnt = 1;
//cerr << "Init: " << tos(N, curr) << ": " << curr << endl;
for(int i = N; i < (int)s.size(); ++i) {
curr = mask & ((curr << 5) + (s[i]-'a'));
//cerr << " " << i << ": " << tos(N, curr) << ": " << curr << endl;
map<ULL,int>::iterator it = m.find(curr);
if(it == m.end()) {
m.insert(make_pair(curr, 1));
}
else {
++it->second;
if(it->second > bestCnt) {
bestCnt = it->second;
best = curr;
}
}
}
cout << tos(N, best) << endl;
}
return 0;
}