int an, a[N];
int bn, b[N];
int cn, c[N];
int f[2][N][N]; // N^3 --> N^2

void relax( int &a, int b ) {
  a = max(a, b);
}

int main() {
  forn(i, an + 1) {
    // last[][] -> next[][]
    // i & 1 --> (i+1) & 1
    // memset(f[(i+1)&1], 0, sizeof(f[0]));
    // можно не обнулять, потому что f[i] возрастает
    forn(j, bn + 1)
      forn(k, cn + 1) {
        relax(f[(i+1)&1][j][k], f[i&1][j][k]);
        relax(f[i&1][j+1][k], f[i&1][j][k]);
        relax(f[i&1][j][k+1], f[i&1][j][k]);
        if (a[i] == b[j] && b[j] == c[k])
          relax(f[(i+1)&1][j+1][k+1], f[i&1][j][k]+1);
      }
  }
}