func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, ans = 0;   int a[1000 + 10], pre[9][1000 + 10], kr[9][1000 + 10], cnt[10];   int f[1000 + 10][1 << 8];   int g[9] = {0, 1, 2, 4, 8, 16, 32, 64, 128};   int read() {     int x = 0, f = 1;     char ch = getchar();     while (!isdigit(ch)) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (isdigit(ch)) x = x * 10 + ch -  0 , ch = getchar();     return x * f;   }   int find(int t, int p) {     int l = 1, r = n, tmp;     while (l <= r) {       int mid = l + r >> 1;       pre[t][mid] > p || pre[t][mid] == 0 ? r = mid - 1                                           : (l = mid + 1, tmp = mid);     }     return tmp;   }   bool check(int st) {     memset(f, -1, sizeof(f));     int tmp = -1;     for (int i = 1; i <= n; i++) {       f[i][0] = 0;       for (int j = 0; j < (1 << 8); j++) {         if (j != (1 << 8) - 1) {           for (int k = 1; k <= 8; k++)             if (!(j & g[k]) && f[i][j] != -1) {               int p = pre[k][i - (a[i] == k)];               if (st == 0) tmp = max(tmp, f[i][j]);               if (kr[k][p + st] != 0)                 f[kr[k][p + st]][j | g[k]] =                     max(f[kr[k][p + st]][j | g[k]], f[i][j] + st);               if (kr[k][p + st + 1] != 0)                 f[kr[k][p + st + 1]][j | g[k]] =                     max(f[kr[k][p + st + 1]][j | g[k]], f[i][j] + st + 1);             }         } else if (f[i][j] != -1)           tmp = max(tmp, f[i][j]);       }     }     if (tmp != -1) {       ans = max(ans, tmp);       return true;     } else       return false;   }   int main() {     n = read();     for (int i = 1; i <= n; i++) {       a[i] = read();       for (int j = 1; j <= 8; j++) pre[j][i] = pre[j][i - 1] + (a[i] == j);       kr[a[i]][++cnt[a[i]]] = i;     }     int l = 0, r = n;     while (l <= r) {       int mid = l + r >> 1;       check(mid) ? l = mid + 1 : r = mid - 1;     }     printf( %d n , ans);     return 0;   }   