func_code_string: #include <bits/stdc++.h>   using namespace std;   struct Edge {     int u, v, cap, cost, next;   } edge[555 * 1111];   int head[555];   int NV, NE, vs, vt;   void addEdge(int u, int v, int cap, int cost) {     edge[NE].u = u;     edge[NE].v = v;     edge[NE].cap = cap;     edge[NE].cost = cost;     edge[NE].next = head[u];     head[u] = NE++;     edge[NE].u = v;     edge[NE].v = u;     edge[NE].cap = 0;     edge[NE].cost = -cost;     edge[NE].next = head[v];     head[v] = NE++;   }   bool vis[555];   int d[555], pre[555];   bool SPFA() {     for (int i = 0; i < NV; ++i) {       vis[i] = 0;       d[i] = (1 << 30);     }     vis[vs] = 1;     d[vs] = 0;     queue<int> que;     que.push(vs);     while (!que.empty()) {       int u = que.front();       que.pop();       for (int i = head[u]; i != -1; i = edge[i].next) {         int v = edge[i].v;         if (edge[i].cap && d[v] > d[u] + edge[i].cost) {           d[v] = d[u] + edge[i].cost;           pre[v] = i;           if (!vis[v]) {             vis[v] = 1;             que.push(v);           }         }       }       vis[u] = 0;     }     return d[vt] != (1 << 30);   }   int MCMF() {     int res = 0;     while (SPFA()) {       int flow = (1 << 30), cost = 0;       for (int u = vt; u != vs; u = edge[pre[u]].u) {         flow = min(flow, edge[pre[u]].cap);       }       for (int u = vt; u != vs; u = edge[pre[u]].u) {         edge[pre[u]].cap -= flow;         edge[pre[u] ^ 1].cap += flow;         cost += flow * edge[pre[u]].cost;       }       res += cost;     }     return res;   }   int tn, ch[55500][26], fail[55500];   vector<int> vec[55500];   void insert(char *s, int k) {     int x = 0;     for (int i = 0; s[i]; ++i) {       int y = s[i] -  a ;       if (ch[x][y] == 0) ch[x][y] = ++tn;       x = ch[x][y];     }     vec[x].push_back(k);   }   void getfail() {     queue<int> que;     for (int i = 0; i < 26; ++i) {       if (ch[0][i]) que.push(ch[0][i]);     }     while (!que.empty()) {       int x = que.front();       que.pop();       for (int i = 0; i < 26; ++i) {         if (ch[x][i]) {           fail[ch[x][i]] = ch[fail[x]][i];           que.push(ch[x][i]);         } else           ch[x][i] = ch[fail[x]][i];       }     }   }   int val[111], len[111];   void ac(char *s) {     int x = 0;     for (int i = 0; s[i]; ++i) {       int y = s[i] -  a ;       x = ch[x][y];       for (int tmp = x; tmp; tmp = fail[tmp]) {         for (int j = 0; j < vec[tmp].size(); ++j) {           int k = vec[tmp][j];           addEdge(i - len[k] + 1, i + 1, 1, -val[k]);         }       }     }   }   char S[555], T[555];   int main() {     int n, m, x;     scanf( %d%s%d , &n, S, &m);     for (int i = 1; i <= m; ++i) {       scanf( %s%d , T, val + i);       len[i] = strlen(T);       insert(T, i);     }     scanf( %d , &x);     vs = n + 1;     vt = vs + 1;     NV = vt + 1;     NE = 0;     memset(head, -1, sizeof(head));     addEdge(vs, 0, x, 0);     addEdge(n, vt, x, 0);     for (int i = 1; i <= n; ++i) {       addEdge(i - 1, i, (1 << 30), 0);     }     getfail();     ac(S);     printf( %d , -MCMF());     return 0;   }   