From SEGFAULT SQUAD
About
include <bits/stdc++.h>
using namespace std; using ll = long long;
define int ll
enum color { R, B, Y, G };
color col(string s) { if (s == "Red") return R; if (s == "Blue") return B; if (s == "Yellow") return Y; return G; }
color convert(int i) { if (i == 0) return R; if (i == 1) return B; if (i == 2) return Y; return G; }
int cache[4][1001][2]; int helper(vector<unordered_map<int, int>>& dealer, vector<unordered_map<int, int>>& player, color c, int num, bool dealerTurn) {
if ((dealerTurn && dealer[c][num] == 0) || (!dealerTurn && player[c][num] == 0)) return 0;
if (cache[c][num][dealerTurn] != -1) {
return cache[c][num][dealerTurn];
}
int dTotal = 0;
int pTotal = 0;
for (int i = 0; i < 4; i++) {
dTotal += dealer[convert(i)][num];
pTotal += player[convert(i)][num];
}
int totalDealer = 0;
int totalPlayer = 0;
if (dealerTurn) {
if (dTotal < pTotal) {
totalDealer = 2 * dTotal - 1;
totalPlayer = 2 * dTotal;
} else if (dTotal > pTotal) {
totalDealer = 2 * pTotal + 1;
totalPlayer = 2 * pTotal;
} else {
totalDealer = 2 * pTotal - 1;
totalPlayer = 2 * pTotal;
}
} else {
if (dTotal < pTotal) {
totalDealer = 2 * dTotal;
totalPlayer = 2 * dTotal + 1;
} else if (dTotal > pTotal) {
totalDealer = 2 * pTotal;
totalPlayer = 2 * pTotal - 1;
} else {
totalDealer = 2 * pTotal;
totalPlayer = 2 * pTotal - 1;
}
}
int res = 1;
if (dealerTurn) {
for (int j = 0; j < 4; j++) {
if (j == c) {
for (int i = num + 1; i <= 1000; i++) {
// if (player[c][i] == 0) continue;
if (dealer[c][num] == 1)
res = max(res, helper(dealer, player, c, i, false) + 1);
else
res = max(res, helper(dealer, player, c, i, false) + totalDealer);
}
} else if (j != c && dealer[convert(j)][num] > 0) {
for (int i = num + 1; i <= 1000; i++) {
// if (player[convert(j)][i] == 0) continue;
res = max(res, helper(dealer, player, convert(j), i, false) + totalDealer);
}
}
}
for (int j = 0; j < 4; j++) {
if (player[convert(j)][num] == 0) continue;
for (int i = num + 1; i <= 1000; i++) {
// if (dealer[convert(j)][i] == 0) continue;
res = max(res, helper(dealer, player, convert(j), i, true) + totalPlayer);
}
}
} else {
for (int j = 0; j < 4; j++) {
if (j == c) {
for (int i = num + 1; i <= 1000; i++) {
// if (dealer[c][i] == 0) continue;
if (player[c][num] == 1)
res = max(res, helper(dealer, player, c, i, true) + 1);
else
res = max(res, helper(dealer, player, c, i, true) + totalPlayer);
}
} else if (j != c && player[convert(j)][num] > 0) {
for (int i = num + 1; i <= 1000; i++) {
// if (dealer[convert(j)][i] == 0) continue;
res = max(res, helper(dealer, player, convert(j), i, true) + totalPlayer);
}
}
}
for (int j = 0; j < 4; j++) {
if (dealer[convert(j)][num] == 0) continue;
for (int i = num + 1; i <= 1000; i++) {
// if (player[convert(j)][i] == 0) continue;
res = max(res, helper(dealer, player, convert(j), i, false) + totalDealer);
}
}
}
// cout<<c<<" "<<num<<" "<<dealerTurn<<" "<<totalDealer<<" "<<totalPlayer<<" "<<" "<<endl;
// cout<<res<<endl;
return cache[c][num][dealerTurn] = res;
}
// color convert(int i) { // if (i == 0) return R; // if (i == 1) return B; // if (i == 2) return Y; // return G; // }
main() { int n ; cin >> n; memset(cache, -1, sizeof(cache)); vector<unordered_map<int, int>> dealer(4), player(4); for (int i = 0; i < n; i++) { string s; int num; cin >> s >> num; dealer[col(s)][num]++; } for (int i = 0; i < n; i++) { string s; int num; cin >> s >> num; player[col(s)][num]++; } int res = 0; for (int i= 0; i < 4; i++) { for (int j = 1; j <= 1000; j++) { res = max(res, helper(dealer, player, convert(i), j, true)); } } cout<<res<<endl; }