#include using namespace std; struct Edge { int to; long long cost; }; struct Dijkstra { vector> g; int n, x; vector dist; vector prev; Dijkstra(vector> g_, int x_) : g(g_), n(g.size()), x(x_), dist(n, 1000000000000000000), prev(n) { build(); } void build() { vector visit(n, false); priority_queue, vector>, greater>> que; dist[x] = 0LL; que.push({dist[x], x}); while (!que.empty()) { int v = que.top().second; que.pop(); if (visit[v]) { continue; } visit[v] = true; for (auto e : g[v]) { int nv = e.to; long long d = e.cost; if (dist[nv] > dist[v] + d) { dist[nv] = dist[v] + d; prev[nv] = v; que.push({dist[nv], nv}); } } } } long long getdist(int y) { return dist[y]; } vector getroute(int y) { int cur = y; vector res = {cur}; while (cur != x) { cur = prev[cur]; res.push_back(cur); } reverse(res.begin(), res.end()); return res; } }; int main() { int n, q; cin >> n >> q; vector a(n), b(q); for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < q; i++) { cin >> b[i]; } //(i, j) クエリをi個処理して現在jにいる vector> g((q + 1) * n); for (int i = 0; i <= q; i++) { for (int j = 0; j < n - 1; j++) { //(i, j) <-> (i, j+1) g[n * i + j].push_back({n * i + j + 1, 1LL}); g[n * i + j + 1].push_back({n * i + j, 1LL}); } } for (int i = 1; i <= q; i++) { for (int j = 0; j < n; j++) { //(i-1, j-1) -> (i, j) (cost 1) //(i-1, j) -> (i, j) (cost 0) //(i-1, j+1) -> (i, j) (cost 1) if (b[i - 1] == a[j]) { if (j >= 1) { g[n * (i - 1) + j - 1].push_back({n * i + j, 1LL}); } g[n * (i - 1) + j].push_back({n * i + j, 0LL}); if (j < n - 1) { g[n * (i - 1) + j + 1].push_back({n * i + j, 1LL}); } } } } Dijkstra D(g, 0); long long ans = 1000000000000000000; for (int j = 0; j < n; j++) { ans = min(ans, D.getdist(n * q + j)); } cout << ans << endl; }