#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;
}