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)\)

Hdu6586 String 字符串字典序贪心的更多相关文章

  1. CF 628C --- Bear and String Distance --- 简单贪心

    CF 628C 题目大意:给定一个长度为n(n < 10^5)的只含小写字母的字符串,以及一个数d,定义字符的dis--dis(ch1, ch2)为两个字符之差, 两个串的dis为各个位置上字符 ...

  2. 字符串处理/贪心 Codeforces Round #307 (Div. 2) B. ZgukistringZ

    题目传送门 /* 题意:任意排列第一个字符串,使得有最多的不覆盖a/b字符串出现 字符串处理/贪心:暴力找到最大能不覆盖的a字符串,然后在b字符串中动态得出最优解 恶心死我了,我最初想输出最多的a,再 ...

  3. Java String字符串/==和equals区别,str。toCharAt(),getBytes,indexOf过滤存在字符,trim()/String与StringBuffer多线程安全/StringBuilder单线程—— 14.0

    课程概要 String 字符串 String字符串常用方法 StringBuffer StringBuilder String字符串: 1.实例化String对象 直接赋值  String str=& ...

  4. [CareerCup] 1.3 Permutation String 字符串的排列

    1.3 Given two strings, write a method to decide if one is a permutation of the other. 这道题给定我们两个字符串,让 ...

  5. 03-Java String字符串详解

    1.Java字符串String A.实例化String字符串:直接赋值(更合理一些,使用较多).使用关键字new. B.String内容的比较 // TODO Auto-generated metho ...

  6. C++学习38 string字符串的增删改查

    C++ 提供的 string 类包含了若干实用的成员函数,大大方便了字符串的增加.删除.更改.查询等操作. 插入字符串 insert() 函数可以在 string 字符串中指定的位置插入另一个字符串, ...

  7. C++学习37 string字符串的访问和拼接

    访问字符串中的字符 string 字符串也可以像字符串数组一样按照下标来访问其中的每一个字符.string 字符串的起始下标仍是从 0 开始.请看下面的代码: #include <iostrea ...

  8. java String字符串——进度1

    String字符串    在JAVA中提供了多种创建字符串对象的方法,这里介绍最简单的两种,    第一种是直接赋值,    第二种是使用String类的构造方法:    如下所示:    Strin ...

  9. 关于String字符串反转

    这是网上看到的一篇java面试题中的问题: 问题是: 如何将一个String字符串反转. String str = "1234567"; int length = str.leng ...

随机推荐

  1. dos命令获取系统时间与变量定义

    1.获取系统时间及格式化 参考文章: 1.1 cmd下获取系统时间 1.2 获取系统时间的DOS命令 2.变量定义 https://www.jb51.net/article/49197.htm 3.使 ...

  2. P5048 [[Ynoi2019模拟赛]Yuno loves sqrt technology III]

    为什么我感觉这题难度虚高啊-- 区间众数的出现次数- 计算器算一下 \(\sqrt 500000 = 708\) 然后我们发现这题的突破口? 考虑分块出来[L,R]块的众数出现个数 用 \(\text ...

  3. Python基本数据类型set方法概述

    li=[1,2,3,4,5,6,3,2,1] s2 = set(li) print(set(li)) #difference()去除相同项,生成一个新的集合,删除 s3=s2.difference([ ...

  4. [Arc068D/At2299] Card Eater - 结论

    [Arc068D/At2299] 有一堆牌,每张牌上有一个数字. 每次可以取出其中 \(3\) 张,丢掉数字最大的和数字最小的牌,把中间那张再放回牌堆. 要求最后所有剩余牌上的数字互不相同,求最多能剩 ...

  5. Oracle 数据库,远程访问 ora-12541:TNS:无监听程序

    1.修改网络连接IPV4设置为固定IP IP地址:192.168.100.8子网掩码:255.255.255.0默认网关:192.168.100.1首选DNS:192.168.100.1 2.修改.. ...

  6. Virtual DOM(八)

    Virtual DOM 这个概念相信大部分人都不会陌生,它产生的前提是浏览器中的 DOM 是很“昂贵"的,为了更直观的感受,我们可以简单的把一个简单的 div 元素的属性都打印出来,如图所示 ...

  7. SpringMVC处理中文乱码

    SpringMVC自带过滤器 添加至web.xml文件 <filter> <filter-name>encoding</filter-name> <filte ...

  8. JS高级---正则表达式练习身份证号码

    写正则表达式, 根据字符串来写正则表达式进行匹配 经验: 1.找规律  2.不要追求完美   身份证的正则表达式 15位或者18位 ([1-9][0-9]{14})|([1-9][0-9]{16}[0 ...

  9. dev、test、pre和prod是什么意思?

      开发环境(dev):开发环境是程序猿们专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告.   测试环境(test):一般是克隆一份生产环境的配置,一个程序在测试环境工 ...

  10. Django | 解决“(1146, "Table 'mydb.django_session' doesn't exist")”报错的方法

    我只写了下面一行 就生成了session表 manage.py makemigrations sessions manage.py migrate sessions 参考:https://www.cn ...