func_code_string: #include <bits/stdc++.h>   using namespace std;   using T = int;   struct Edge {     int from, to;     T cost, flow, cap;     Edge(int _from = 0, int _to = 0, T _cost = 0, T _cap = 0)         : from(_from), to(_to), cost(_cost), flow(0), cap(_cap) {}   };   const int N = 7010;   const int INF = 0x3f3f3f3f;   int n;   vector<Edge> edges;   vector<int> g[N];   int par[N];   int dist[N];   int pi[N];   void addEdge(int from, int to, T cost, T cap) {     g[from].push_back(edges.size());     edges.emplace_back(from, to, cost, cap);     g[to].push_back(edges.size());     edges.emplace_back(to, from, -cost, 0);   }   bool dijkstra(int s, int t) {     for (int i = 0; i <= t; ++i) {       dist[i] = INF;       par[i] = -1;     }     priority_queue<pair<T, int>, vector<pair<T, int>>, greater<pair<T, int>>> pq;     dist[s] = 0;     pq.push({0, s});     while (!pq.empty()) {       auto on = pq.top();       pq.pop();       int chosen = on.second;       int d = on.first;       if (d > dist[chosen]) continue;       for (int edge_id : g[chosen]) {         int to = edges[edge_id].to;         int cost = edges[edge_id].cost;         T flowing = edges[edge_id].flow;         T cap = edges[edge_id].cap;         if (cap <= flowing) continue;         if (dist[to] > dist[chosen] + pi[chosen] - pi[to] + cost) {           dist[to] = dist[chosen] + pi[chosen] - pi[to] + cost;           par[to] = edge_id;           pq.push({dist[to], to});         }       }     }     return dist[t] != INF;   }   int mcmf(int s, int t) {     memset(pi, 0, sizeof pi);     int cost = 0, max_flow = 0;     while (dijkstra(s, t)) {       for (int i = 0; i <= t; ++i) {         pi[i] += dist[i];       }       int cur = t, flow = (1 << 30);       for (int cur = t; par[cur] != -1; cur = edges[par[cur]].from) {         flow = min(flow, edges[par[cur]].cap - edges[par[cur]].flow);       }       for (int cur = t; par[cur] != -1; cur = edges[par[cur]].from) {         cost += edges[par[cur]].cost * flow;         edges[par[cur]].flow += flow;         edges[par[cur] ^ 1].flow -= flow;       }       max_flow += flow;     }     return cost;   }   int main() {     scanf( %d , &n);     vector<int> a(n);     addEdge(0, 1, 0, 4);     for (int i = 0; i < n; ++i) {       scanf( %d , &a[i]);     }     for (int i = 0; i < n; ++i) {       addEdge(1, i + 2, 0, 1);       addEdge(i + 2, n + i + 2, -1, 1);       addEdge(n + i + 2, 2 * n + 2, 0, 1);       for (int j = i + 1; j < n; ++j) {         if (abs(a[i] - a[j]) == 1 or a[i] % 7 == a[j] % 7) {           addEdge(n + i + 2, j + 2, 0, 1);         }       }     }     printf( %d n , -1 * mcmf(0, 2 * n + 2));     return 0;   }   