#include #define ll long long #define inf 1000000000 using namespace std; int T,n,a,b,c,d[7]; char s[5]; int fir[105],nxt[205],to[205],dis[205],flow[205],cnt; int Si=0,Ti=10; int vis[105],Flow[105],Dis[105],pre[105],last[105],maxflow,mincost; int read(){ int x=0;char ch=getchar(); while(!isdigit(ch)) ch=getchar(); while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); return x; } void print(ll x){ if(x>=10) print(x/10); putchar(x%10+'0'); } void add(int u,int v,int F,int D){ to[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt; flow[cnt]=F,dis[cnt]=D; } bool spfa(){ queue q; memset(Dis,0x7f,sizeof(Dis)); memset(Flow,0x7f,sizeof(Flow)); memset(vis,0,sizeof(vis)); q.push(Si),vis[Si]=1,Dis[Si]=0,pre[Ti]=-1; while(!q.empty()){ int now=q.front(); q.pop(); vis[now]=0; for(int i=fir[now];i!=-1;i=nxt[i]){ if(flow[i]>0&&Dis[to[i]]>Dis[now]+dis[i]){ Dis[to[i]]=Dis[now]+dis[i]; pre[to[i]]=now; last[to[i]]=i; Flow[to[i]]=min(Flow[now],flow[i]); if(!vis[to[i]]){ vis[to[i]]=1; q.push(to[i]); } } } } return pre[Ti]!=-1; } void MCMF(){ maxflow=0,mincost=0; while(spfa()){ int now=Ti; maxflow+=Flow[Ti]; mincost+=Flow[Ti]*Dis[Ti]; while(now!=Si){ flow[last[now]]-=Flow[Ti]; flow[last[now]^1]+=Flow[Ti]; now=pre[now]; } } } int main(){ T=read(); while(T--){ n=read(); a=read(),b=read(),c=read(); memset(d,0,sizeof(d)); for(int i=1;i<=n;i++){ scanf("%s",s+1); if(s[1]=='0'){ if(s[2]=='1') d[1]++;else d[2]++; } if(s[1]=='1'){ if(s[2]=='0') d[3]++;else d[4]++; } if(s[1]=='2'){ if(s[2]=='0') d[5]++;else d[6]++; } } cnt=-1; memset(fir,-1,sizeof(fir)); add(Si,1,a,0),add(1,Si,0,0); add(Si,2,b,0),add(2,Si,0,0); add(Si,3,c,0),add(3,Si,0,0); add(1,4,inf,-3),add(4,1,0,3); add(1,5,inf,-3),add(5,1,0,3); add(1,6,inf,-2),add(6,1,0,2); add(1,7,inf,-1),add(7,1,0,1); add(1,8,inf,-2),add(8,1,0,2); add(1,9,inf,-1),add(9,1,0,1); add(2,4,inf,-2),add(4,2,0,2); add(2,5,inf,-1),add(5,2,0,1); add(2,6,inf,-3),add(6,2,0,3); add(2,7,inf,-3),add(7,2,0,3); add(2,8,inf,-1),add(8,2,0,1); add(2,9,inf,-2),add(9,2,0,2); add(3,4,inf,-1),add(4,3,0,1); add(3,5,inf,-2),add(5,3,0,2); add(3,6,inf,-1),add(6,3,0,1); add(3,7,inf,-2),add(7,3,0,2); add(3,8,inf,-3),add(8,3,0,3); add(3,9,inf,-3),add(9,3,0,3); for(int i=1;i<=6;i++) add(i+3,Ti,d[i],0),add(Ti,i+3,0,0); MCMF(); print(-mincost),puts(""); } return 0; }