func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T>   void gmin(T &a, T b) {     a = a < b ? a : b;   }   template <typename T>   void gmax(T &a, T b) {     a = a > b ? a : b;   }   const int MAXV = 410;   const int MAXE = 1650;   const int INF = 0x3f3f3f3f;   struct Edge {     int to, cap, nxt, cost;     Edge() {}     Edge(int to, int cap, int nxt, int cost)         : to(to), cap(cap), nxt(nxt), cost(cost) {}   } edge[MAXE << 1];   int head[MAXV], cnt;   void initedge() {     memset(head, -1, sizeof(head));     cnt = 0;   }   inline void addedge(int from, int to, int cap, int cost) {     edge[cnt] = Edge(to, cap, head[from], cost);     head[from] = cnt++;   }   inline void addedge2(int from, int to, int cap, int cost) {     addedge(from, to, cap, cost);     addedge(to, from, 0, -cost);   }   int dist[MAXV];   int iter[MAXV];   bool inq[MAXV];   bool SPFA(int S, int T) {     static int q[MAXV];     int f = 0, r = 0;     memset(dist, INF, sizeof(dist));     memset(inq, 0, sizeof(inq));     dist[S] = 0;     q[r++] = S;     inq[S] = true;     while (f != r) {       int x = q[f++];       inq[x] = false;       if (f == MAXV) f = 0;       for (int p = head[x]; ~p; p = edge[p].nxt) {         Edge e = edge[p];         if (e.cap && dist[e.to] > dist[x] + e.cost) {           dist[e.to] = dist[x] + e.cost;           if (!inq[e.to]) {             q[r++] = e.to;             inq[e.to] = true;             if (r == MAXV) r = 0;           }         }       }     }     return dist[T] < INF;   }   int getflow(int x, int lim, int T) {     if (x == T) return lim;     inq[x] = true;     int nowflow = 0, newflow;     for (register int &p = iter[x]; ~p; p = edge[p].nxt) {       register Edge &e = edge[p];       if (!inq[e.to] && e.cap && dist[e.to] == dist[x] + e.cost) {         newflow = getflow(e.to, min(e.cap, lim - nowflow), T);         e.cap -= newflow;         edge[p ^ 1].cap += newflow;         nowflow += newflow;         if (nowflow >= lim) break;       }     }     return nowflow;   }   int mincostmaxflow(int S, int T) {     int nowcost = 0, newflow;     while (SPFA(S, T)) {       for (int i = 0; i < MAXV; i++) iter[i] = head[i];       memset(inq, 0, sizeof(inq));       do {         newflow = getflow(S, INF, T);         nowcost += newflow * dist[T];       } while (newflow);     }     return nowcost;   }   const int MAXN = 210;   const int MAXM = 210;   int S, T, second, TT;   int n1, n2, m, r, b;   int id[MAXM];   int delta[MAXV];   char s[MAXN];   int ans;   int main() {     initedge();     scanf( %d%d%d%d%d , &n1, &n2, &m, &r, &b);     S = 0;     T = n1 + n2 + 1;     scanf( %s , s);     for (int i = 1; i <= n1; i++) {       char c = s[i - 1];       if (c ==  R ) {         addedge2(i, T, INF - 1, 0);         delta[i] -= 1;         delta[T] += 1;       }       if (c ==  B ) {         addedge2(S, i, INF - 1, 0);         delta[S] -= 1;         delta[i] += 1;       }       if (c ==  U ) {         addedge2(S, i, INF - 0, 0);         addedge2(i, T, INF - 0, 0);       }     }     scanf( %s , s);     for (int i = 1; i <= n2; i++) {       char c = s[i - 1];       if (c ==  B ) {         addedge2(n1 + i, T, INF - 1, 0);         delta[n1 + i] -= 1;         delta[T] += 1;       }       if (c ==  R ) {         addedge2(S, n1 + i, INF - 1, 0);         delta[S] -= 1;         delta[n1 + i] += 1;       }       if (c ==  U ) {         addedge2(S, n1 + i, INF - 0, 0);         addedge2(n1 + i, T, INF - 0, 0);       }     }     for (int i = 0; i < m; i++) {       int x, y;       scanf( %d%d , &x, &y);       id[i] = cnt;       addedge2(x, n1 + y, 1 - 0, b);       addedge2(n1 + y, x, 1 - 0, r);     }     addedge2(T, S, INF - 0, 0);     second = n1 + n2 + 2;     TT = n1 + n2 + 3;     int sum = 0;     for (int i = S; i <= T; i++) {       if (delta[i] > 0) addedge2(second, i, delta[i], 0), sum += delta[i];       if (delta[i] < 0) addedge2(i, TT, -delta[i], 0);     }     ans = mincostmaxflow(second, TT);     sum = 0;     for (int p = head[second]; ~p; p = edge[p].nxt) sum += edge[p].cap;     if (!sum) {       printf( %d n , ans);       for (int i = 0; i < m; i++) {         if (edge[id[i]].cap == 0)           putchar( B );         else if (edge[id[i] + 2].cap == 0)           putchar( R );         else           putchar( U );       }       putchar(  n );     } else       printf( -1 n );     return 0;   }   