码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2021-05-25 17:36:48      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:name   max   vector   for   lang   ace   return   space   cto   

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;
}

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

标签:name   max   vector   for   lang   ace   return   space   cto   

原文地址:https://www.cnblogs.com/scl0725/p/14805643.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!