字典序最小的子序列 51Nod - 1255

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1255

记录每个字母出现的最早和最晚位置 然后扫一遍 维护一个单调栈 但是并不只考虑字母大小 还要考虑出现最早最晚位置 如果当前字母比栈顶元素小 并且栈顶元素在在之后还会出现 那就换掉这个栈顶

#include 
using namespace std;
const int maxn=1e5+10;
const int maxc=50;

stack  stk;
int l[maxc],r[maxc],book[maxc];
int n,len;
char ch[maxn],ans[maxc];

int main()
{
    int i;
    scanf("%s",ch);
    n=strlen(ch);
    memset(l,0x3f,sizeof(l));
    memset(r,-1,sizeof(r));
    for(i=0;ich[i]&&r[stk.top()-'a']>i)
            {
                book[stk.top()-'a']=0;
                stk.pop();
            }
            stk.push(ch[i]);
            book[ch[i]-'a']=1;
        }
    }
    len=stk.size();
    while(!stk.empty())
    {
        ans[--len]=stk.top();
        stk.pop();
    }

    printf("%s\n",ans);
    return 0;
}

 

你可能感兴趣的:(思维,单调栈/队列)