func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MOD = 1e9 + 7;   const double PI = acos(-1.);   const double eps = 1e-10;   const int INF = 0x3f3f3f3f;   const long long INFll = 0x3f3f3f3f3f3f3f3f;   const int MAXN = 1e6 + 5;   const int MX = 123456;   const int inf = 0x3f3f3f3f;   const int MXE = 1e7;   struct MinCost_MaxFlow {     struct Edge {       int v, w, nxt;       int cost;     } E[MXE];     int head[MX], tot, level[MX], pre[MX], d[MX];     bool vis[MX];     void init() {       memset(head, -1, sizeof(head));       tot = 0;     }     void add(int u, int v, int w, int cost) {       E[tot].v = v;       E[tot].w = w;       E[tot].cost = cost;       E[tot].nxt = head[u];       head[u] = tot++;       E[tot].v = u;       E[tot].w = 0;       E[tot].cost = -cost;       E[tot].nxt = head[v];       head[v] = tot++;     }     bool spfa(int s, int t) {       memset(vis, 0, sizeof(vis));       memset(d, 0x3f, sizeof(d));       memset(pre, -1, sizeof(pre));       queue<int> q;       q.push(s);       d[s] = 0;       vis[s] = 1;       while (!q.empty()) {         int u = q.front();         q.pop();         vis[u] = 0;         for (int i = head[u]; ~i; i = E[i].nxt) {           int w = E[i].w, v = E[i].v, cost = E[i].cost;           if (w > 0 && d[v] > d[u] + cost) {             d[v] = d[u] + cost;             pre[v] = i;             if (!vis[v]) {               q.push(v);               vis[v] = 1;             }           }         }       }       return pre[t] != -1;     }     int solve(int s, int t, int &cost) {       int flow = 0;       cost = 0;       while (spfa(s, t)) {         int minFlow = inf;         for (int i = pre[t]; ~i; i = pre[E[i ^ 1].v])           minFlow = min(minFlow, E[i].w);         for (int i = pre[t]; ~i; i = pre[E[i ^ 1].v]) {           cost += minFlow * E[i].cost;           E[i].w -= minFlow;           E[i ^ 1].w += minFlow;         }         flow += minFlow;       }       return flow;     }   } F;   int a[MAXN];   int main() {     int n;     scanf( %d , &n);     F.init();     for (int i = 1; i <= n; i++) scanf( %d , &a[i]);     int st = 0, en = 2 * n + 5;     int add = en - 1;     F.add(st, add, 4, 0);     int magic = 4;     for (int i = 1; i <= n; i++) {       F.add(add, i, 1, 0);       F.add(i + n, en, 1, 0);       F.add(i, i + n, 1, -1);       F.add(i, i + n, INF, 0);       int cnt1 = 0, cnt2 = 0;       for (int j = i + 1; j <= n; j++) {         if (abs(a[i] - a[j]) == 1 && cnt1 <= magic) {           F.add(i + n, j, 1, 0);           cnt1++;         }         if (a[i] % 7 == a[j] % 7 && cnt2 <= magic) {           F.add(i + n, j, 1, 0);           cnt2++;         }       }     }     int flow, cost;     flow = F.solve(st, en, cost);     printf( %d n , -cost);     return 0;   }   