1. 程式人生 > >洛谷P1439 最長公共子序列(O(nlogn)最長公共子序列模板)

洛谷P1439 最長公共子序列(O(nlogn)最長公共子序列模板)

題目描述:

給出1-n的兩個排列P1和P2,求它們的最長公共子序列。

題解:

此題要求O(nlogn)解決LCS。

我們考慮LCS轉LIS,二分維護。

我們保證一個序列是單調的,那麼將另一個序列按照標號排序,會發現轉換後的LIS就是原序列的LCS。

但是這種解法有一個限制——兩個排列要求是1~n的。

附上程式碼:

#include<cstdio>
int a[100001],a1[100001],c[100001],n,b[100001],d[100001],l,cnt,len,idx,ans;
int find(int l,int r,int x)
{
    while(l<r)
    {
        
int mid=(l+r)/2; if(d[mid]>=x) r=mid; else l=mid+1; } return l; } int main() { scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&b[i]); a1[b[i]]=i; } for(int i=1;i<=n;++i) { scanf("%d",&c[i]); a[i]
=a1[c[i]]; } for(int i=1;i<=n;++i) { idx=find(1,len+1,a[i]); if(idx>len) ++len; d[idx]=a[i]; } printf("%d",len); }