Minimal string CodeForces – 797C

题目链接

题目难度: 1700rating

题目类型:string+贪心+STL

题目思路:

由于题目要求的最终结果是字典序最小的那个字符串,那么我们从贪心的从’a’开始查找字符串里是否存在,如果存在,就先把后面的所有的该字符放在答案字符串u中(u可以用queue来表示),而字符串t可以用stack来表示。
中间的字符串都加入到stack中,当一个字符全加入后,继续从小到大的查找剩余字符串中还剩的字符,并且与栈顶元素进行比较,如果小于栈顶元素,需要先输出栈顶元素。
中间的细节比较多,详细看代码。
我用的map来维护剩余的字符数量。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <stack>
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb std::ios::sync_with_stdio(false)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define gg(x) getInt(&x)
using namespace std;
typedef long long ll;
inline void getInt(int* p);
const int maxn=1000010;
/*** TEMPLATE CODE STARTS HERE ***/
char s[maxn];
int n;
map<char ,int > m;
int main()
{
    scanf("%s",s);
    n=strlen(s);
    rep(i,0,n)
    {
        int x=m[(s[i])];
        m[(s[i])] =x+1;
    }
    stack<char> st;
    queue<char> q;
    while(!q.empty())
    {
        q.pop();
    }
    while(!st.empty())
    {
        st.pop();
    }
    char x='a'-1;
    int index=0;
    while(q.size()!=n)
    {
        char i;
        for( i='a';i<='z';i++)
        {
            if(m.count(i)!=0&&m[i]!=0)
            {
                x=i;

                break;
            }
        }
        if(i=='z'+1)
        {
            if(!st.empty())
                x=st.top();
        }
        if(!st.empty()&&st.top()<x)
        {
            x=st.top();
        }

        while(!st.empty()&&st.top()==x)
        {
            st.pop();
            q.push(x);
            if(!st.empty()&&st.top()<x)
            {
                x=st.top();
            }
        }
        if(m.count(x)==0||m[x]==0)
            continue;
        int num=m[x];
        m.erase(x);
        for(int j=index;j<n;j++)
        {
            if(s[j]==x)
            {
                q.push(x);
                num--;
            }else
            {
                st.push(s[j]);
                m[s[j]]=m[s[j]]-1;
            }
            if(!num)
            {
                index=j+1;
                break;
            }
        }

    }
    while(!q.empty())
    {
        printf("%c",q.front());
        q.pop();
    }
    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}

 

全部评论

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午&nbsp;腾讯csig&nbsp;腾讯云部门,面完秒进入复试状态4.16下午&nbsp;美团优选供应链部门,4.18上午发二面4.17晚上&nbsp;阿里国际一面,纯拷打,面完我都玉玉了4.18下午&nbsp;阿里国际二面,是我们leader面的我,很轻松~~4.18晚上&nbsp;约了hr面4.19上午&nbsp;hr面,下午两点口头oc4.19晚上&nbsp;意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月&nbsp;&nbsp;一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月&nbsp;莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务