zoukankan      html  css  js  c++  java
  • O(logn)最长上升子序列并输出

    O(logn)最长上升子序列并输出

    +++

    pre数组记录转移。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 1e6 + 10;
    
    string s, a[N];
    int q[N];
    int idx;
    int len;
    int pre[N];
    
    int main()
    {
        memset(pre, -1, sizeof pre);
        
        cin >> s;
        for (int i = 0; i < s.size(); i ++ )
        {
            if (s[i] >= 65 && s[i] <= 90) idx ++ ;
            a[idx] += s[i];
        }
        
        //for (int i = 1; i <= idx; i ++ ) cout << a[i] << endl;
        
        for (int i = 1; i <= idx; ++i)
        {
            int l = 0, r = len;
            while (l < r)
            {
                int mid = l + r + 1 >> 1;
                if (a[q[mid]] < a[i]) l = mid;
                else r = mid - 1;
            }
            len = max(len, r + 1);
            pre[i] = q[r];  //pre[i]记录方案的转移
            q[r + 1] = i;
        }
        
        //for (int i = 1; i <= idx; i ++ ) cout << q[i] << ' ';
        //cout << endl;
        //for (int i = 1; i <= idx; i ++ ) cout << pre[i] << ' ';
        
        vector<string> res;
        for (int i = q[len]; i; i = pre[i]) res.push_back(a[i]);
        for (int i = res.size() - 1; i >= 0; --i) cout << res[i];
        cout << endl;
        
        return 0;
    }
    
  • 相关阅读:
    补码原理
    清风徐来,水波不兴
    月尾和周尾
    又一春又一季
    9.11
    晨光无限
    9.18
    心悠
    小事一桩
    一周岁啦
  • 原文地址:https://www.cnblogs.com/scl0725/p/14805643.html
Copyright © 2011-2022 走看看