#include<bits/stdc++.h> using namespace std; #define maxn 100005 #define inf 0x3f3f3f3f struct Edge{int to,nxt,w;}e[maxn<<1]; int head[maxn],tot,N,F,D,s,t; void init(){memset(head,-1,sizeof head);tot=0;} void add(int u,int v,int w){ e[tot].to=v;e[tot].w=w;e[tot].nxt=head[u];head[u]=tot++; e[tot].to=u;e[tot].w=0;e[tot].nxt=head[v];head[v]=tot++; } int d[maxn]; int bfs(){ memset(d,0,sizeof d); queue<int>q; q.push(s);d[s]=1; while(q.size()){ int x=q.front();q.pop(); for(int i=head[x];i!=-1;i=e[i].nxt){ int y=e[i].to; if(e[i].w==0 || d[y])continue; d[y]=d[x]+1; q.push(y); if(y==t)return 1; } } return 0; } int dfs(int x,int flow){ if(x==t)return flow; int rest=flow; for(int i=head[x];i!=-1 && rest;i=e[i].nxt){ int y=e[i].to; if(e[i].w==0 || d[y]!=d[x]+1)continue; int k=dfs(y,min(rest,e[i].w)); rest-=k;e[i].w-=k;e[i^1].w+=k; } return flow-rest; } int dinic(){ int ans=0; while(bfs()) while(int flow=dfs(s,inf)) ans+=flow; return ans; } char buf[maxn]; int main(){ while(scanf("%d%d%d",&N,&F,&D)!=EOF){ init(); s=0;t=N*2+F+D+1;int x; for(int i=1;i<=F;i++){ scanf("%d",&x); add(s,i+2*N,x); } for(int i=1;i<=D;i++){ scanf("%d",&x); add(i+2*N+F,t,x); } for(int i=1;i<=N;i++){ scanf("%s",buf+1); for(int j=1;j<=F;j++) if(buf[j]=='Y') add(j+2*N,i,inf); } for(int i=1;i<=N;i++){ scanf("%s",buf+1); for(int j=1;j<=D;j++) if(buf[j]=='Y') add(i+N,j+F+2*N,inf); } for(int i=1;i<=N;i++)//拆点 add(i,i+N,1); cout<<dinic()<<' '; } }