zoukankan      html  css  js  c++  java
  • Minimal string CodeForces

    Minimal string CodeForces - 797C

    题意:有一个字符串s和空串t和u,每次操作可以将s的第一个字符取出并删除然后放到t的最后,或者将t的最后一个字符取出并删除然后放到u的最后。要求使得最后s和t均为空串。求字典序最小的可能得到的u。

    分析:这道题的操作相当于“将s中字符按从左到右顺序入栈,在任意次的入栈后可以进行任意次的出栈”。显然,最后得到字符串的长度一定是相等的,因此字典序最小就是要前面的尽可能的小。因此可以用一个数组分别记录还未入栈的'a'到'z'的个数,按照'a'到'z'的顺序去找。每找一个字符c的第一步是:首先在栈顶找出所有大于等于c的字符,出栈并输出。之后的操作只有在还有未入栈的c时才去做:在原串中还未入栈的部分从前往后找c,把其他字符入栈,把c直接输出(相当于入栈后直接出栈、输出),直到所有未入栈的c没有了。找完'z'后,再将所有栈中剩余字符出栈并输出即可。

     1 #include<cstdio>
     2 #include<cstring>
     3 char s[100100];
     4 int a[200],now,top;
     5 char st[100100];
     6 //曾经误将top写成char类型导致re
     7 int main()
     8 {
     9     scanf("%s",s);
    10     int i,len=strlen(s);
    11     for(i=0;i<len;i++)
    12         a[s[i]]++;
    13     for(i='a';i<='z';i++)
    14     {
    15         while(top>0&&st[top]<=i)
    16         {
    17             printf("%c",st[top]);
    18             top--;
    19         }
    20         while(a[i])
    21         {
    22             while(s[now]!=i&&now<len)
    23             {
    24                 st[++top]=s[now];
    25                 a[s[now]]--;
    26                 now++;
    27             }
    28             while(s[now]==i&&now<len)
    29             {
    30                 printf("%c",i);
    31                 a[i]--;
    32                 now++;
    33             }
    34         }
    35     }
    36     while(top>0)
    37     {
    38         printf("%c",st[top--]);
    39     }
    40     return 0;
    41 }
  • 相关阅读:
    什么是跨域
    w3c标准
    什么是域名?什么网站名?什么是URL?
    meta是什么意思?
    什么是HTML、XML和XHTML
    html4.0.1,h5,xhml,文档声明区别
    checkbox 点击全选
    【今日CV 计算机视觉论文速览】Fri, 22 Mar 2019
    【机器翻译】API接口总结
    【今日CV 计算机视觉论文速览】Fri, 22 Mar 2019
  • 原文地址:https://www.cnblogs.com/hehe54321/p/cf-797c.html
Copyright © 2011-2022 走看看