CodeForce-797C Minimal string(贪心模拟)

Minimal string

CodeForces - 797C

Petya 收到一个长度不超过 105 的字符串 s。他拿了两个额外的空字符串 tu 并决定玩一个游戏。这个游戏有两种合法操作:

  • s 串的第一个字符移动到字符串 t 的末尾。
  • t 串的最后一个字符移动到字符串 u 的末尾。

Petya 希望将 st 都变为空串并且使得串 u 字典序最小。

你需要写一个代码求出最小的字典序。

Input

第一行包含一个非空串 s (1?≤?|s|?≤?105),只包含小写字母。

Output

输出串 u.

保存每个字符的出现次数 当前位置可以填入的字符要么为当前栈顶 若有比栈顶还小的字符 则找到该字符即可

#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 20;
string s, t, u, a;

int b[30];
int pos[30];
int h[N];
stack<char> sta;
int main()
{
    while (cin >> s)
    {
        int len = s.length();
        memset(b, 0, sizeof(b));

        for (int i = 0; s[i]; i++)
            b[s[i] - ‘a‘]++;
        int i = 0, k;
        while (s[i])
        {
            int k1 = 26;
            if (!sta.empty())
                k1 = sta.top() - ‘a‘;
            for (k = 0; k < 26; k++)
            {
                if (b[k])
                    break;
            }
            k = min(k1, k);
            while (true)
            {
                if (!sta.empty() && sta.top() - ‘a‘ == k)
                    break;
                b[s[i] - ‘a‘]--;
                sta.push(s[i++]);
                if (s[i] == ‘\0‘)
                    break;
            }
            if (!sta.empty())
            {
                printf("%c", sta.top());
                sta.pop();
            }
        }
        while (!sta.empty())
        {
            char c = sta.top();
            sta.pop();
            printf("%c", c);
        }
        cout << endl;
    }
    return 0;
}
时间: 2024-11-06 07:29:16

CodeForce-797C Minimal string(贪心模拟)的相关文章

Codeforces 797C -Minimal string

Petya recieved a gift of a string s with length up to 105 characters for his birthday. He took two more empty strings t and u and decided to play a game. This game has two possible moves: Extract the first character of s and append t with this charac

Minimal string CodeForces – 797C

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

[贪心+模拟] zoj 3829 Known Notation

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5383 Known Notation Time Limit: 2 Seconds      Memory Limit: 65536 KB Do you know reverse Polish notation (RPN)? It is a known notation in the area of mathematics and computer science.

POJ 1979 POJ 3009 AOJ 0033 AOJ 0118 [搜索类题目][0033贪心模拟]

/** POJ 1979 BFS */ #include <stdio.h> #include <string.h> #include <iostream> #include <queue> using namespace std; const int N = 20 + 5; int mp[N][N]; int sx,sy; int n, m; int vis[3000]; int dirx[] = {0, 1, 0, -1}; int diry[] = {

hdu 4915 Parenthese sequence (贪心+模拟)

题目大意: 一个序列中有左括号和右括号,还有问号,问号可以任意转换成左右括号. 问这个序列有多少种情况的转变使得这个序列变成合法的括号匹配序列. 思路分析: 首先我们分析一下,如何使得一个序列是合法的括号匹配序列. 我们很容易想到的是用栈模拟匹配过程. 当遇到左括号就进栈,当遇到右括号就让栈顶的左括号出栈. 那么在模拟的过程中,造成这个序列的不合法的原因只有当右括号来的时候,此时的栈已经为空. 这里补充一句,一旦一个序列给定,那么这里面的问号有多少变成左括号,多少变成右括号,是一定的. 看完以上

String结构模拟

我们开始模拟一下大家最熟悉的String数据结构的模拟,这个相信做java的没有不熟悉的吧.那我们开始 1.操作接口 public interface IString { public void clear();          //将一个已经存在的串置成空串 public boolean isEmpty();    //判断当前串是否为空,为空则返回true,否则返回false public int length();         //返回字符串的长度 public char charA

1002 Game (贪心模拟)

1002 Game (贪心模拟)Accepts: 572 Submissions: 6218 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 度度熊在玩一个好玩的游戏. 游戏的主人公站在一根数轴上,他可以在数轴上任意移动,对于每次移动,他可以选择往左或往右走一格或两格. 现在他要依次完成 n 个任务,对于任务 i,只要他处于区间 [ai,bi]

【题解】AGC007E Shik and Copying String(贪心)

[题解]AGC007E Shik and Copying String(贪心) 刚开始看完题以为是一个老鼠进洞模型,不过发现这里还要求不同种类的匹配不可香蕉,而且代价不是一定的... 追踪最终得到的串\(T\)每个字符\(T_i\)的来源,可以发现是一条引向\(p<i\)的折线,可以发现这条直线覆盖的\(x\)轴上的长度越小越好,最终答案是所有形如这样的匹配的折线中拐点最多的折线的拐点个数.用一个双端队列维护当前匹配的拐点的\(x\)坐标,从后向前考虑\(T\)中每个字符的匹配. 设当前枚举到\

CodeForce 508C Anya and Ghosts (贪心+模拟)

题目大意:有m个时刻,在第i时刻即wi秒的时候需要保持有r根蜡烛亮着,每根蜡烛维持的时间为t秒,点一根蜡烛需要1秒. 注意:一根蜡烛亮的时间为下一秒开始.并且一开始是可以事先准备蜡烛的. 想法:利用了优先队列,维护r根蜡烛,每次wi秒,它需要开始点蜡烛的最晚时间为wi-t,如果不够这个时间,那么在最晚结束点蜡烛的时间wi-1开始补上. 感谢阿扎夫人提供的思维题. AC代码: #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include&