• HackerRank "AND xor OR"


    Actually I think problem statement is somewhat misleading. No need to mention range [L, R] at all.

    The intention is a variation to "Largest Rectangle" which is a classic stack problem on LeetCode.

    But you need to run Largest Rectangle twice: increased and decreased.

    #include <cmath>
    #include <stack>
    #include <cstdio>
    #include <vector>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    
    int main() {
        int n; cin >> n;
        vector<int> in(n);
        for(int i = 0; i < n; i ++)
            cin >> in[i];
        
        int ret = 0;
        {
            in.push_back(0); 
            stack<int> stk;
            for (int i = 0; i < in.size(); i++)
            {
                if (stk.empty() || in[i] > stk.top())
                {
                    stk.push(in[i]);
                }
                else
                {
                    int lastV = stk.top(); stk.pop();
                    if (!stk.empty())
                    {
                        ret = std::max(ret, (lastV ^ stk.top()));            
                        //cout << lastV << "-" << stk.top() << "=" << (lastV ^ stk.top()) << endl;
                    }
                    i--;
                }
            }
            in.pop_back();
        }
        {
            
            stack<int> stk;
            in.insert(in.begin(), 0);
            for (int i = in.size() - 1; i >= 0; i --)
            {
                if (stk.empty() || in[i] > stk.top())
                {
                    stk.push(in[i]);
                }
                else
                {
                    int lastV = stk.top(); stk.pop();
                    if (!stk.empty())
                    {
                        ret = std::max(ret, (lastV ^ stk.top()));            
                        //cout << lastV << "-" << stk.top() << "=" << (lastV ^ stk.top()) << endl;
                    }
                    i++;
                }
            }
        }
        
        cout << ret << endl;
        return 0;
    }
    View Code
  • 相关阅读:
    Ajax学习总结
    从零开始学Docker
    IBM Websphere MQ常用命令及常见错误
    Log4j学习总结
    Eclipse中各图标含义
    类加载机制与反射
    Feign【入门】
    Eureka【故障演练分析】
    Eureka【启用https】
    Eureka【开启http basic权限认证】
  • 原文地址:https://www.cnblogs.com/tonix/p/4988677.html
Copyright © 2020-2023  润新知