#include <bits/stdc++.h> using namespace std; static long long solve_segment(const vector<long long>& cnt) { // 在一段“大小连续”的序列上,计算最多能取到的同花顺个数 int m = (int)cnt.size(); if (m < 5) return 0; vector<long long> used(m, 0); // 该位置已经被用掉的数量 long long ans = 0; for (int i = 0; i + 5 <= m; ++i) { long long t = LLONG_MAX; for (int j = 0; j < 5; ++j) t = min(t, cnt[i + j] - used[i + j]); if (t <= 0) continue; ans += t; for (int j = 0; j < 5; ++j) used[i + j] += t; } return ans; } int main() { int n; cin >> n; // 四种花色分别存 (点数, 数量) vector<pair<long long, long long>> vs, vh, vd, vc; for (int i = 0; i < n; ++i) { long long a, cnt; char c; cin >> a >> cnt >> c; if (c == 'S') vs.emplace_back(a, cnt); else if (c == 'H') vh.emplace_back(a, cnt); else if (c == 'D') vd.emplace_back(a, cnt); else vc.emplace_back(a, cnt); // 'C' } auto calc_one_suit = [&](vector<pair<long long, long long>>& v)->long long { if (v.empty()) return 0; sort(v.begin(), v.end()); // 按点数升序 // 同点数合并 vector<pair<long long, long long>> t; for (auto& p : v) { if (!t.empty() && t.back().first == p.first) t.back().second += p.second; else t.push_back(p); } long long score = 0; // 按“连续段”划分 int L = 0, R = 0, m = (int)t.size(); while (L < m) { R = L; while (R + 1 < m && t[R + 1].first == t[R].first + 1) ++R; // 取出这一段的数量序列 vector<long long> cnt; cnt.reserve(R - L + 1); for (int i = L; i <= R; ++i) cnt.push_back(t[i].second); score += solve_segment(cnt); L = R + 1; } return score; }; long long ans = 0; ans += calc_one_suit(vs); ans += calc_one_suit(vh); ans += calc_one_suit(vd); ans += calc_one_suit(vc); cout << ans << '\n'; return 0; }