1. 程式人生 > >luogu P1439 【模板】最長公共子序列

luogu P1439 【模板】最長公共子序列

bsp 第一個 順序 它的 amp while ++ return scan

題目qwq

(第一道藍題)

據說是用了hash的思想(?)

總之是先把第一個序列每個數出現的順序記下來(其實第一個序列的數字不用記),

然後第二個序列的每個數都對照它的順序,這樣只要得到一個升序的序列就行了qwq

如果遇到出現順序在前面的數,就用二分法找一下它的位置,然後把原來存下來的順序覆蓋掉

技術分享圖片
#include<cstdio>
using namespace std;
int f[100005],ans[100005];
int n,sum;
int k,l,r,now,mid;
int main() {
    scanf("%d",&n);
    for(int i = 1; i <= n; i++) {
        scanf(
"%d",&k); f[k] = i; } for(int i = 1; i <= n; i++) { scanf("%d",&k); now = f[k]; if(now > ans[sum]) ans[++sum] = now; else { l = 1,r = sum; while(l < r) { mid = (l+r)/2;
if (ans[mid]<now)l = mid+1; else r = mid; } ans[l] = now; } } printf("%d",sum); return 0; }
View Code

luogu P1439 【模板】最長公共子序列