inlineintread(){ char c; while (c = getchar(), c < '0' || c>'9'); intx(c - '0'); while (c = getchar(), c >= '0' && c <= '9') x = x * 10 + c - '0'; return x; }
int id[MAXn + 10]; int mapping[MAXn + 10]; int d[MAXn + 10]; intmain(){ int n; cin >> n; for (int i = 1; i <= n; i++) id[read()] = i; for (int i = 1; i <= n; i++) mapping[i] = id[read()]; memset(d, 0x3f, sizeof(d)); int len = 0; d[0] = 0; for (int i = 1; i <= n; i++) { int l = 0, r = len, mid; if (mapping[i] > d[len]) d[++len] = mapping[i]; else { while (l < r) { mid = (l + r) / 2; if (d[mid] > mapping[i]) r = mid; else l = mid + 1; } d[l] = min(mapping[i], d[l]); } } cout << len; return0; }