func_code_string: #include <bits/stdc++.h>   using namespace std;   static const int INF = 0x3f3f3f3f;   static const long long INFL = 0x3f3f3f3f3f3f3f3fLL;   vector<string> split(string s, string sep) {     string act =   ;     vector<string> res;     for (int c = 0; c < s.size(); c++) {       bool split = false;       for (int c2 = 0; c2 < sep.size(); c2++) {         if (sep[c2] == s[c]) {           split = true;           break;         }       }       if (split) {         res.push_back(act);         act =   ;       } else {         act = act + s[c];       }     }     res.push_back(act);     return res;   }   string removeChars(string s, string filters) {     string res =   ;     for (int c = 0; c < s.size(); c++) {       bool fine = true;       for (int c2 = 0; c2 < filters.size(); c2++) {         if (filters[c2] == s[c]) {           fine = false;           break;         }       }       if (fine) res = res + s[c];     }     return res;   }   string replaceChars(string s, string from, string to) {     for (int c = 0; c < s.size(); c++) {       for (int c2 = 0; c2 < from.size(); c2++) {         if (from[c2] == s[c]) {           s[c] = to[c2 % to.size()];           break;         }       }     }     return s;   }   struct MaximumFlow {     static const int InfCapacity = INF;     struct Edge {       int to;       int capacity;       int rev;     };     vector<vector<Edge> > g;     void init(int n) { g.assign(n, vector<Edge>()); }     void add(int i, int j, int capacity) {       Edge e, f;       e.to = j, f.to = i;       e.capacity = capacity, f.capacity = 0;       g[i].push_back(e);       g[j].push_back(f);       g[i].back().rev = (int)g[j].size() - 1;       g[j].back().rev = (int)g[i].size() - 1;     }     void addB(int i, int j, int capacity) {       Edge e, f;       e.to = j, f.to = i;       e.capacity = capacity, f.capacity = capacity;       g[i].push_back(e);       g[j].push_back(f);       g[i].back().rev = (int)g[j].size() - 1;       g[j].back().rev = (int)g[i].size() - 1;     }     int maximumFlow(int s, int t) {       int n = g.size();       vector<int> level(n);       int total = 0;       bool update;       do {         update = false;         fill(level.begin(), level.end(), -1);         level[s] = 0;         queue<int> q;         q.push(s);         for (int d = n; !q.empty() && level[q.front()] < d;) {           int u = q.front();           q.pop();           if (u == t) d = level[u];           for (auto e = (g[u]).begin(); e != (g[u]).end(); ++e)             if (e->capacity > 0 && level[e->to] == -1)               q.push(e->to), level[e->to] = level[u] + 1;         }         vector<int> iter(n);         for (int i = 0; i < n; i++) iter[i] = (int)g[i].size() - 1;         while (1) {           int f = augment(level, iter, s, t, InfCapacity);           if (f == 0) break;           total += f;           update = true;         }       } while (update);       return total;     }     int augment(vector<int> &level, vector<int> &iter, int u, int t, int f) {       if (u == t || f == 0) return f;       int lv = level[u];       if (lv == -1) return 0;       level[u] = -1;       for (; iter[u] >= 0; --iter[u]) {         Edge &e = g[u][iter[u]];         if (level[e.to] <= lv) continue;         int l = augment(level, iter, e.to, t, min(f, e.capacity));         if (l == 0) continue;         e.capacity -= l;         g[e.to][e.rev].capacity += l;         level[u] = lv;         return l;       }       return 0;     }   };   int main() {     vector<int> sizes(6);     for (int c = 0; c < sizes.size(); c++) cin >> sizes[c];     int n;     cin >> n;     MaximumFlow m;     m.init(n + 6 + 2);     for (int c = 0; c < 6; c++) {       m.add(c + 2, 1, sizes[c]);     }     string poss[6] = { S ,  M ,  L ,  XL ,  XXL ,  XXXL };     for (int c = 0; c < n; c++) {       m.add(0, 8 + c, 1);       string line;       cin >> line;       vector<string> possibilities = split(line,  , );       for (int c2 = 0; c2 < possibilities.size(); c2++) {         for (int c3 = 0; c3 < 6; c3++) {           if (poss[c3] == possibilities[c2]) {             m.add(8 + c, c3 + 2, 1);           }         }       }     }     int res = m.maximumFlow(0, 1);     if (res != n) {       cout <<  NO ;       return 0;     }     cout <<  YES  << endl;     for (int c = 0; c < n; c++) {       for (int c2 = 0; c2 < m.g[8 + c].size(); c2++) {         if (m.g[8 + c][c2].capacity == 0) {           cout << poss[m.g[8 + c][c2].to - 2] << endl;         }       }     }   }   