# include using namespace std; # define rep(i,a,n) for (int i=a; i<=n; ++i) # define per(i,a,n) for (int i=a; i>=n; --i) # define bug puts("H"); # define pb push_back # define mp make_pair # define all(x) (x).begin(), (x).end() # define SZ(x) (int)x.size() # define fi first # define se second # define lch p<<1,l,mid # define rch p<<1|1,mid+1,r # define mem(a,b) memset(a,b,sizeof(a)) # define INF 1000000001 # define MOD 1000000007 typedef vector Vi; typedef long long i64; typedef pair Pi; i64 powmod(i64 a, i64 b){i64 res=1;a%=MOD;assert(b>=0);for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;} i64 Inv(i64 b){return powmod(b,(i64)MOD-2);} const int N = 20005; const double eps = 1e-9; map Mp; class Edge{ public: int u, v, cost, flow; }; int cnt = -1; int Head[15], Next[205]; Edge E[205]; int Dist[15]; bool inqueue[15]; int Q[205]; int Path[15]; int Flow[15]; const int inf = 2147483647; int ss, tt; void Add_Edge(int u,int v,int cost,int flow) { cnt++; Next[cnt]=Head[u]; Head[u]=cnt; E[cnt].u=u; E[cnt].v=v; E[cnt].cost=cost; E[cnt].flow=flow; cnt++; Next[cnt]=Head[v]; Head[v]=cnt; E[cnt].u=v; E[cnt].v=u; E[cnt].flow=0; E[cnt].cost=-cost; } bool spfa() { for (int i=ss;i<=tt;i++) Dist[i]=-inf; memset(inqueue,0,sizeof(inqueue)); int h=1,t=0; Q[1]=0; inqueue[0]=1; Dist[0]=0; Flow[0]=inf; do { t++; int u=Q[t]; inqueue[u]=0; for (int i=Head[u];i!=-1;i=Next[i]) { int v=E[i].v; if ((E[i].flow>0)&&(Dist[v]> T; while (T--) { int n, a, b, c; cin >> n >> a >> b >> c; Mp.clear(); string tmp; rep(i,1,n) { cin >> tmp; ++Mp[tmp]; } int sz = SZ(Mp); cnt = -1; memset(Head, -1, sizeof(Head)); ss = 0; tt = 3+sz+1; Add_Edge(ss, 1, 0, a); Add_Edge(ss, 2, 0, b); Add_Edge(ss, 3, 0, c); int p = 3; for (auto i: Mp) { ++p; tmp = i.fi; rep(j,0,2) { if (tmp[j] == '0') Add_Edge(1, p, 3-j, i.se); else if (tmp[j] == '1') Add_Edge(2, p, 3-j, i.se); else Add_Edge(3, p, 3-j, i.se); } Add_Edge(p, tt, 0, i.se); } int Ans = 0; while (spfa()) { int now = tt; int last = Path[now]; while (now!=0) { E[last].flow -= Flow[tt]; E[last^1].flow += Flow[tt]; now = E[last].u; last = Path[now]; } Ans += Dist[tt]*Flow[tt]; } printf("%d\n", Ans); } return 0; }