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. 已知float后几位,谋几位保留

    设变量n为float类型,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五入运算的表达式____. #include "common.h" #includ ...

  2. Selenium3+python自动化016-多线程

    1.进程 什么是进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基 ...

  3. linux--后端项目部署

    nginx + uwsgi + crm + mysql + virtualenv + supervisor项目部署 1.后端整起,用uwsgi启动crm 2.创建一个新的虚拟环境,用于运行crm新业务 ...

  4. Jmeter-第三方插件安装

    1.插件下载 官方地址https://jmeter-plugins.org/install/Install/ 网盘地址链接: https://pan.baidu.com/s/1E4lnMWDGPWCN ...

  5. 文件包含漏洞(DVWA环境中复现)

    LOW: 源代码: <?php // The page we wish to display $file = $_GET[ 'page' ]; ?> 可以看到,low级别的代码对包含的文件 ...

  6. 小I选宾馆

    小 I 选宾馆 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小 I 去天津玩啦,一路上,他跟他的同学发生了许多有趣的 ...

  7. Wannafly Camp 2020 Day 1E 树与路径 - 树上差分,LCA

    #include <bits/stdc++.h> using namespace std; #define int long long const int N = 1000005; vec ...

  8. Wannafly Camp 2020 Day 1F 乘法 - 字符串

    一开始想根据单调性双指针 后来血了才想起来负负得正 于是暴力二分答案即可 #include <bits/stdc++.h> using namespace std; #define int ...

  9. Ora-00906:missing left parenthesis

    问题描述 Ora-00906:missing left parenthesis 问题原因 varchar和varchar2  必须指定长度,不然会报错

  10. AE创建组件失败,项目中已存在对esri.arcgis.***的引用

    AE创建组件失败,项目中已存在对esri.arcgis.***的引用 解决办法:在解决方案资源管理器的引用中把错误提示中的引用删掉,再创建组件就没问题了.