#include using namespace std; #define reg register typedef long long ll; #define rep(i,a,b) for(int i=a,i##end=b;i<=i##end;++i) #define drep(i,a,b) for(int i=a,i##end=b;i>=i##end;--i) typedef pair Pii; typedef unsigned long long ull; typedef double db; #define mp make_pair #define pb push_back #define Mod1(x) ((x>=P)&&(x-=P)) #define Mod2(x) ((x<0)&&(x+=P)) template inline void cmin(T &a,T b){ ((a>b)&&(a=b)); } template inline void cmax(T &a,T b){ ((a T rd(){ T s=0; int f=0; while(!isdigit(IO=getchar())) if(IO=='-') f=1; do s=(s<<1)+(s<<3)+(IO^'0'); while(isdigit(IO=getchar())); return f?-s:s; } const int N=1e5+10,INF=1e9+10; int n,S,T; int a[3],b[3][3][3],id[3]; char s[3]; struct Edge{ int to,nxt,w,c; }e[N]; int head[N],ecnt; void AddEdge(int u,int v,int w,int c) { e[ecnt]=(Edge){v,head[u],w,c}; head[u]=ecnt++; } void Link(int u,int v,int w,int c){ AddEdge(u,v,w,c),AddEdge(v,u,0,-c); } #define erep(u,i) for(int i=head[u];~i;i=e[i].nxt) int dis[N],inq[N]; int SPFA(){ rep(i,1,n) dis[i]=-INF; static queue que; que.push(S); dis[S]=0; while(!que.empty()) { int u=que.front(); que.pop(); inq[u]=0; erep(u,i) { int v=e[i].to,w=e[i].w,c=e[i].c; if(!w || dis[v]>=dis[u]+c) continue; dis[v]=dis[u]+c; if(!inq[v]) inq[v]=1,que.push(v); } } return dis[T]>0; } int vis[N]; int Dfs(int u,int flowin) { if(u==T) return flowin; int flowout=0; vis[u]=1; erep(u,i) { int v=e[i].to,w=e[i].w,c=e[i].c; if(dis[v]!=dis[u]+c || !w || vis[v]) continue; int t=Dfs(v,min(flowin-flowout,w)); flowout+=t,e[i].w-=t,e[i^1].w+=t; if(flowin==flowout) break; } vis[u]=0; if(!flowout) dis[u]=-1; return flowout; } int Dinic(){ int ans=0,t; while(SPFA()) while((t=Dfs(S,INF))) ans+=t*dis[T]; return ans; } int main(){ memset(head,-1,sizeof head); rep(kase,1,rd()) { n=rd(); rep(i,0,2) a[i]=rd(); memset(b,0,sizeof b); rep(i,1,n) scanf("%s",s),b[s[0]-'0'][s[1]-'0'][s[2]-'0']++; n=0,S=++n,T=++n; rep(i,0,2) id[i]=++n,Link(id[i],T,a[i],0); rep(i,0,2) rep(j,0,2) rep(k,0,2) if(b[i][j][k]) { Link(S,++n,b[i][j][k],0); Link(n,id[i],INF,3); Link(n,id[j],INF,2); Link(n,id[k],INF,1); } printf("%d\n",Dinic()); rep(i,1,n) head[i]=-1; ecnt=0; } }