• Hdu6586 String 字符串字典序贪心


    Hdu6586 字符串字典序贪心

    题意

    给出一个只包含26个字符的字符串(|S|<=1e5),要求从中取出长度为k的字典序最小的组序列,满足所给的26个字母的限制条件,例如([l_i,r_i]),表示i字符的数量关系限制

    分析

    1.对于构造字典序最小的序列,通常是一位一位构造的。
    2.首先题目有限制条件,所以我们考虑一下什么条件时才满足限制条件。
    我们从a开始取,每次碰到a,如果满足限制条件,我们肯定取上,这样才能满足字典序最小,那么限制条件是什么?什么时候停止取a转向去取b,我们对此进行思考:假设在确定当前位置pos时,pos时的字符取不取,取决于其满不满足限制条件,那什么条件满足的时候才能取呢,一个浅显的思路,肯定要够取到每个字母的下界才能取,不然总数都不够,取个锤子。那么就还剩下了k这个限制条件,因为要取k个,这个如何转化呢?假设已经取了c个取当前的pos的点,因为我们是从字典序小的字母向字典序大的字母取的,那么下一次是取和这个pos点相同的字母,还是取下一个字母呢?因为还要取cnt=k-c-1个cnt肯定要大于后面的未满足的限制条件的下界和,同时cnt还不能超过未满足的上界的和,不然就炸了。因为这个判断条件只能判断当前这个点能不能取(例如(abba)假如第二个a不能取,那也要到第二个a才能判断,如果直接扫过去,发现第二个a不能取,又要倒回第一个a后面取b,这样就变成了O((n^2))所以我们要对此优化,只要开个数组记下每个字母的位置,然后每次从这个数组中找下一个字母的位置进行判断即可)由此我们把问题转化成了:从a-z取,若a满足限制条件则继续取a,否则去取b,以此类推,因为我们的思考,等于说已经把限制条件封装成了一个函数,只要每次取的时候调用这个函数即可。

    PS:找下一个字母好像有大佬用的序列自动机,准备填坑。。

    思考

    对于找字典序的最小最大的题意,一般都是一位一位确定。以此为核心,同时还要把限制条件转化,判断该位能不能取(判断条件可能是前缀,后缀等),可能还要记录位置优化,这样就能尽可能取小(大)的字典序,并且复杂度大部分题为(O(N))

  • 相关阅读:
    Docker 网络
    Dockerfile你值得拥有
    Spring boot配置成功后,出现Whitelabel Error Page的解决办法
    ubuntu 创建快捷方式
    Ubuntu Make来安装Visual Studio Code
    ubuntu16.04开机自动挂载Windows分区
    ubuntu下使用罗技Unifying
    酷开电视升级后无法启动
    ArcGIS 10.2安装错误,Error: Internal Error 2753. The File is not marked for installation
    ubuntu16.04下使用wine 运行微信开发小程序
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/11247875.html
Copyright © 2020-2023  润新知