#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <queue>
using namespace std;
#define inf 1000000000
#define MAXN 11555
struct Edge
{
int v, f, next;
};
int n, f, d, src, sink;
int g[200010];
int nume;
Edge e[200010];
void Addedge( int u, int v, int c)
{
e[nume].v = v, e[nume].f = c, e[nume].next = g[u];
g[u] = nume++;
e[nume].v = u, e[nume].f = 0, e[nume].next = g[v];
g[v] = nume++;
};
void init( )
{
memset( g, -1, sizeof(g));
nume = 0;
}
queue< int > que;
bool vis[MAXN];
int dist[MAXN];
void bfs( )
{
memset(dist, 0, sizeof(dist));
while(!que.empty()) que.pop();
vis[src] = 1;
que.push(src);
while(!que.empty())
{
int u = que.front();
que.pop();
for( int i = g[u]; i != -1 ; i = e[i].next)
{
if(e[i].f && !vis[e[i].v])
{
que.push(e[i].v);
dist[e[i].v] = dist[u] + 1;
vis[e[i].v] = 1;
}
}
}
}
int dfs( int u, int delta)
{
if(u == sink)
return delta;
else
{
int ret = 0;
for( int i = g[u]; delta && i!=-1; i = e[i].next)
if(e[i].f && dist[e[i].v] == dist[u] + 1)
{
int dd = dfs(e[i].v, min(e[i].f, delta));
e[i].f -= dd;
e[i^1].f += dd;
delta -= dd;
ret += dd;
}
return ret;
}
}
int maxflow( )
{
int ret = 0;
while(true)
{
memset(vis, 0, sizeof(vis));
bfs();
if(!vis[sink]) return ret;
ret += dfs(src, inf);
}
}
int main()
{
int n, f, d;
while(scanf("%d %d %d",&n, &f, &d) != EOF)
{
int val;
init();
src = 0, sink = n*2 + f + d + 1;
for( int i = 1; i <= f; i++)
{
scanf("%d",&val);
Addedge(src, i, val);
}
for( int j = 1; j <= d; j++)
{
scanf("%d",&val);
Addedge(f + n*2 + j, sink, val);
}
for( int i = 1; i <= n; i++)
Addedge(f+i, f+n+i, 1);
char can[300];
for( int i = 1; i <= n; i++)
{
scanf("%s",can);
for( int k = 0; k < f; k++)
if(can[k] == 'Y')
Addedge(k+1, f+i, 1);
}
for( int i = 1; i <= n; i++)
{
scanf("%s",can);
for( int k = 0; k < d; k++)
if(can[k] == 'Y')
Addedge(f+n+i, n*2+f+k+1, 1);
}
printf("%d\n",maxflow());
}
return 0;
}