#include using namespace std; typedef long long ll; typedef pair pii; #define fir first #define sec second #define rep(i,a,b) for (int i = (a); i <= (b); ++ i) #define rrp(i,a,b) for (int i = (a); i >= (b); -- i) #define gc() getchar() template inline void read(tp& x) { x = 0; char tmp; bool key = 0; for (tmp = gc(); !isdigit(tmp); tmp = gc()) key = (tmp == '-'); for (; isdigit(tmp); tmp = gc()) x = (x << 3) + (x << 1) + (tmp ^ '0'); if (key) x = -x; } template inline void ckmn(tp& x,tp y) { x = x < y ? x : y; } template inline void ckmx(tp& x,tp y) { x = x < y ? y : x; } const int N = 50, M = 100, INF = 0x3f3f3f3f; struct edge { int la,b,cap,co; } con[M]; int tot=1,fir[N],ans,dis[N],st,en,now,n,m,flo,inq[N],vis[N]; void add(int from,int to,int capc,int cos) { con[++tot] = (edge) {fir[from],to,capc,cos}; fir[from] = tot; con[++tot] = (edge) {fir[to],from,0,-cos}; fir[to] = tot; } int dfs(int pos,int imp) { if (pos == en || (!imp)) return ans += now * imp, imp; int ret = 0, tmp; vis[pos] = 1; for (int i = fir[pos] ; i ; i = con[i].la) { if (!con[i].co && !vis[con[i].b]) { tmp = dfs(con[i].b,min(imp,con[i].cap)); con[i].cap -= tmp; con[i^1].cap += tmp; ret += tmp; imp -= tmp; if (!imp) break; } } return ret; } deque q; void qpush(int pos) { inq[pos] = 1; if (q.empty()) q.push_back(pos); else { if (dis[pos] < dis[q.front()]) q.push_front(pos); else q.push_back(pos); } } bool spfa() { while (!q.empty()) q.pop_back(); memset(dis,0x3f,sizeof dis); memset(inq,0,sizeof inq); dis[st] = 0; qpush(st); for (int pos ; !q.empty() ; ) { pos = q.front(); q.pop_front(); inq[pos] = 0; for (int i = fir[pos] ; i ; i = con[i].la) { if (con[i].cap && dis[con[i].b] > dis[pos] + con[i].co) { dis[con[i].b] = dis[pos] + con[i].co; if (!inq[con[i].b]) qpush(con[i].b); } } } if (dis[en] == INF) return 0; now += dis[en]; for (int pos = 1 ; pos <= n ; ++ pos) { for (int i = fir[pos] ; i ; i = con[i].la) con[i].co += dis[pos] - dis[con[i].b]; } return 1; } void init() { tot = 1; memset(fir, 0, sizeof fir); ans = now = flo = 0; st = en = 0; } map mp; string imp[10]; int num[10]; int getv(string a,char c) { rep (i, 0, 2) if (a[i] == c) return 3 - i; assert(0); } void solve() { int n, v[3]; init(); read(n), read(v[0]), read(v[1]), read(v[2]); memset(num, 0, sizeof num); rep (i, 1, n) { string tmp; cin >> tmp; ++ num[mp[tmp]]; } st = 10, en = 11; ::n = 11; rep (a, 0, 2) rep (b, 1, 6) add(a + 7, b, INF, - getv(imp[b], '0' + a)); rep (a, 0, 2) add(st, a+7, v[a], 0); rep (b, 1, 6) add(b, en, num[b], 0); while (spfa()) { memset(vis,0,sizeof vis); int tmp = dfs(st,INF); if (!tmp) continue; flo += tmp; } printf("%d\n", -ans); } int main() { int T; read(T); mp["012"] = 1; mp["021"] = 2; mp["102"] = 3; mp["120"] = 4; mp["201"] = 5; mp["210"] = 6; imp[1] = "012"; imp[2] = "021"; imp[3] = "102"; imp[4] = "120"; imp[5] = "201"; imp[6] = "210"; while (T --) solve(); return 0; }