#include using namespace std; #define il inline int s,t,n,m,head[100005],tot=1,p[100005],vis[100005],fl[100005],dis[100005],l[100005]; struct ss{ int node,nxt,w,f; }e[500005]; void add(int u,int v,int w,int f) { e[++tot].nxt=head[u]; head[u]=tot; e[tot].node=v; e[tot].w=w; e[tot].f=f; } il int read() { int re=0,k=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')k=-1;ch=getchar();} while(ch<='9'&&ch>='0'){re=re*10+ch-48;ch=getchar();} return re*k; } il void write(int x) { if(x<0)return putchar('-'),write(-x),void(); if(x<10)return putchar(x+48),void(); return write(x/10),write(x%10),void(); } bool bfs() { for(int i=s;i<=t;i++) { dis[i]=0x3f3f3f3f; vis[i]=0; fl[i]=0x3f3f3f3f; } queue q; dis[s]=0;q.push(s);vis[s]=1;p[t]=-1; while(!q.empty()) { int k=q.front();q.pop(); vis[k]=0; // cerr<0&&dis[e[i].node]>dis[k]+e[i].f) { dis[e[i].node]=dis[k]+e[i].f; p[e[i].node]=k; l[e[i].node]=i; fl[e[i].node]=min(fl[k],e[i].w); if(!vis[e[i].node]) { q.push(e[i].node); vis[e[i].node]=1; } } } } return p[t]!=-1; } void solve() { int ans2=0; while(bfs()) { int now=t; ans2+=fl[t]*dis[t]; while(now!=s) { e[l[now]].w-=fl[t]; e[l[now]^1].w+=fl[t]; now=p[now]; } } write(3*n-ans2); puts(""); } void _add(int u,int v,int w,int f) { add(u,v,w,f); add(v,u,0,-f); } string st; string bs[7]={"\0","012","021","102","120","201","210"}; int g[7]; int main() { int T=read(); while(T--) { n=read(); memset(g,0,sizeof(g)); s=0; int g1=7,g2=8,g3=9,a,b,c; t=10; for(int i=s;i<=t;i++) head[i]=0; tot=1; a=read();b=read();c=read(); _add(s,g1,a,0); _add(s,g2,b,0); _add(s,g3,c,0); for(int i=1;i<=n;i++) { cin>>st; for(int i=1;i<=6;i++) if(bs[i]==st)g[i]++; } for(int i=1;i<=6;i++) { _add(i,t,g[i],0); st=bs[i]; if(st[0]=='0') _add(g1,i,g[i],0); else if(st[0]=='1') _add(g2,i,g[i],0); else _add(g3,i,g[i],0); if(st[1]=='0') _add(g1,i,g[i],1); else if(st[1]=='1') _add(g2,i,g[i],1); else _add(g3,i,g[i],1); if(st[2]=='0') _add(g1,i,g[i],2); else if(st[2]=='1') _add(g2,i,g[i],2); else _add(g3,i,g[i],2); } solve(); } }