OI XXIII - zaj

// https://szkopul.edu.pl/problemset/problem/Orc2Z7ti1xLaUUQDT1a6RGR5/site/?key=statement

#include <bits/stdc++.h>

// using namespace std;

// #define GARY_DBG
#define GARY_LIB

// #define int long long

constexpr int sizik = 15 * 1001;

#define ar std::array
#define pr std::pair
#define vec std::vector

typedef vec<vec<int>> _kra;

int a[sizik], b[sizik];
int memo[sizik];
int prev_a[sizik], prev_b[sizik];
int nwz[2][sizik];

void solve() {
    int n, m;
    std::cin >> n >> m;

    for (int i = 1; i <= n; i++) {
        std::cin >> a[i];
    }
    for (int i = 1; i <= m; i++) {
        std::cin >> b[i];
    }

    for (int i = 1; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            if (a[i] == a[j]) prev_a[j] = std::max(prev_a[j], i);
        }
    }
    for (int i = 1; i <= m; i++) {
        for (int j = i + 1; j <= m; j++) {
            if (b[i] == b[j]) prev_b[j] = std::max(prev_b[j], i);
        }
    }

    // calc
    for (int j = 0; j <= m; j++) {
        nwz[0][j] = memo[j] = 0;
    }
    for (int i = 1; i <= n; i++) {
        nwz[i % 2][0] = 0;
        for (int j = 1; j <= m; j++) {
            if (a[i] == b[j] && prev_a[i] > 0 && prev_b[j] > 0) {
                nwz[i % 2][j] = memo[prev_b[j]] + 2;
            } else {
                nwz[i % 2][j] = 0;
            }
            nwz[i % 2][j] = std::max({nwz[i % 2][j], nwz[(i - 1) % 2][j], nwz[(i) % 2][j - 1]});
        }

        for (int j = 1; j <= m; j++) {
            if (a[i] == b[j]) {
                memo[j] = nwz[(i - 1) % 2][j - 1];
            }
        }
    }

    auto ans = nwz[n % 2][m];

    std::cout << ans << std::endl;
}

int32_t main() {
#ifndef GARY_DBG
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);
#endif

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}