1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 const int N=3050;
6 struct ee{int to,next;}e[N*N];
7 bool map[N][N],vis[N],visit[N];
8 int b[N],a[N],a1[N],a2[N],head[N],link[N];
9 int ans,A,B,M,cnt,n1,n2,T;
10 void ins(int u,int v){
11 e[++cnt].to=v,e[cnt].next=head[u],head[u]=cnt;
12 }
13
14 bool check(int x){
15 if (vis[x]) return 0;
16 for (int i=head[x];i;i=e[i].next){
17 int v=e[i].to;
18 if (!vis[v]&&!visit[v]){
19 vis[v]=1;
20 if (!link[v]||check(link[v])){
21 link[v]=x;
22 return 1;
23 }
24 }
25 }
26 return 0;
27 }
28
29 int main(){
30 {
31 scanf("%d%d%d",&A,&B,&M);
32 for (int i=1;i<=A;i++) {
33 scanf("%d",&a[i]);
34 if (a[i]&1==1) a1[++n1]=i;else a2[++n2]=i;
35 }
36 for (int i=1;i<=B;i++) scanf("%d",&b[i]);
37 memset(map,true,sizeof(map));
38 int u,v;
39 for (int i=1;i<=M;i++){
40 scanf("%d%d",&u,&v);
41 map[u][v]=0; map[v][u]=0;
42 }
43 for (int i=1;i<=B;i++)
44 for (int j=i+1;j<=B;j++){
45 if(i==j) continue;
46 if (!((b[i]^b[j])&1))continue;
47 else{
48 int t=0;
49 for (int k=0;1<<k<=(b[i]|b[j]);k++)
50 if ((b[i]|b[j])&(1<<k)) t++;
51 if (t%2==0) ins(i,j),ins(j,i);
52 }
53 }
54 for (int i=0;i<=B;i++)map[i][0]=0,map[0][i]=0;
55 for (int i=0;i<=n1;i++)
56 for (int j=0;j<=n2;j++){
57 int t=0;
58 int x=a1[i],y=a2[j];
59 memset(visit,0,sizeof(visit));
60 memset(link,0,sizeof(link));
61 for (int k=1;k<=B;k++)if (map[x][k]||map[y][k]) visit[k]=1,t++;
62 for (int k=1;k<=B;k++)
63 if (b[k]&1==1&&!visit[k]){
64 memset(vis,0,sizeof(vis));
65 if (check(k)) t++;
66 }
67 if (i) t--;if (j) t--;
68 ans=max(ans,B-t);
69 }
70 printf("%d",ans);
71 }
72 }