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