#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #pragma comment(linker, "/STACK:10240000000,10240000000") #define mem(x,k) memset(x,k,sizeof(x)) #define rep(i,n) for(int i=0;i pii; #define CHG ch=getchar() #define FRD x=bo=0; for(CHG;ch<'0'||ch>'9';CHG) if(ch=='-')bo=1; #define FR2 for(;ch>='0'&&ch<='9';x=(x<<1)+(x<<3)+ch-'0',CHG); char ch; int bo; inline bool blank(char ch){return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';} inline void rd(int &x){ FRD FR2 if (bo)x=-x; } inline void RD(ll &x){ FRD FR2 if (bo)x=-x; } inline ll RD(){ ll x; RD(x); return x; } inline int rd(){ int x; rd(x); return x;} inline void RD(char *s){///scanf %s for (CHG;blank(ch);CHG); for (;!blank(ch);CHG)*s++=ch; *s=0; } inline void RD(char &c){for(CHG;blank(c);CHG);} inline void RD(double &x){ scanf("%lf",&x);} template inline void OT(T x){ static char buf[20]; char *p1=buf;if(!x)*p1++='0';if (x<0)putchar('-'),x=-x; while(x)*p1++=x%10+'0',x/=10; while(p1--!=buf)putchar(*p1); } #define pe() puts("") #define pk() putchar(' ') #define wt(x) OT(x),pe(); #define wl(a,n) rep(_i,n) OT(a[_i]),putchar(" \n"[_i==n-1]); const int maxn = 1e6 + 14; int st,en; struct Edge { int u,v,w,next; int cost; }e[maxn]; int ecnt,pre[300]; void adde(int u,int v,int w,int cost) { e[ecnt].u=u; e[ecnt].v=v; e[ecnt].w=w; e[ecnt].cost=cost; e[ecnt].next=pre[u]; pre[u]=ecnt++; e[ecnt].u=v; e[ecnt].v=u; e[ecnt].w=0; e[ecnt].cost=-cost; e[ecnt].next=pre[v]; pre[v]=ecnt++; } void init(int s, int ed) { ecnt=0; memset(pre,-1,sizeof(pre)); st =s, en =ed; } bool vis[300]; int p[300]; int dis[300]; bool spfa() { queueque; memset(p,-1,sizeof(p)); memset(vis,0,sizeof(vis)); for(int i=st; i<=en; i++) { dis[i]=inf; } dis[st]=0; vis[st]=1; que.push(st); while(!que.empty()) { int u=que.front(); que.pop(); vis[u]=0; for(int i=pre[u]; i!=-1; i=e[i].next) { int v=e[i].v; if(e[i].w>0&&dis[v]>dis[u]+e[i].cost) { dis[v]=dis[u]+e[i].cost; p[v]=i; if(vis[v]==0) { que.push(v); vis[v]=1; } } } } if(dis[en]==inf) return false; return true; } int MCMF() { int flow=0,mincost=0; int minflow; while(spfa()) { minflow=inf; for(int i=p[en]; i!=-1; i=p[e[i].u]) { minflow=min(minflow,e[i].w); } for(int i=p[en]; i!=-1; i=p[e[i].u]) { e[i].w-=minflow; e[i^1].w+=minflow; } flow+=minflow; mincost+=minflow*dis[en]; } return mincost; } int main(){ map mp; mp["012"] = 5; mp["021"] = 6; mp["102"] = 7; mp["120"] = 8; mp["201"] = 9; mp["210"] = 10; string ss[] = {"","","","","","012","021","102","120","201","210"}; T_T{ int n=rd(); int num[15]; mem(num,0); init(1, 30); int a=rd(),b=rd(),c=rd(); adde(1,2,a,0); adde(1,3,b,0); adde(1,4,c,0); rep(i,n){ char s[10]; RD(s); int k = mp[string(s)]; num[k] ++; } rep(i,6){ int k= i+5; string s = ss[k]; rep(j,3){ int p = s[j] - '0' + 2; adde(p, k, num[k], -(3-j)); } adde(k, 30, num[k],0); } int ans=MCMF(); wt(-ans); } return 0; }