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);
}
}
}