luogu P1439 【模板】最長公共子序列
阿新 • • 發佈:2018-10-27
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(View Code"%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; }
luogu P1439 【模板】最長公共子序列