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)\)
Hdu6586 String 字符串字典序贪心的更多相关文章
- CF 628C --- Bear and String Distance --- 简单贪心
CF 628C 题目大意:给定一个长度为n(n < 10^5)的只含小写字母的字符串,以及一个数d,定义字符的dis--dis(ch1, ch2)为两个字符之差, 两个串的dis为各个位置上字符 ...
- 字符串处理/贪心 Codeforces Round #307 (Div. 2) B. ZgukistringZ
题目传送门 /* 题意:任意排列第一个字符串,使得有最多的不覆盖a/b字符串出现 字符串处理/贪心:暴力找到最大能不覆盖的a字符串,然后在b字符串中动态得出最优解 恶心死我了,我最初想输出最多的a,再 ...
- Java String字符串/==和equals区别,str。toCharAt(),getBytes,indexOf过滤存在字符,trim()/String与StringBuffer多线程安全/StringBuilder单线程—— 14.0
课程概要 String 字符串 String字符串常用方法 StringBuffer StringBuilder String字符串: 1.实例化String对象 直接赋值 String str=& ...
- [CareerCup] 1.3 Permutation String 字符串的排列
1.3 Given two strings, write a method to decide if one is a permutation of the other. 这道题给定我们两个字符串,让 ...
- 03-Java String字符串详解
1.Java字符串String A.实例化String字符串:直接赋值(更合理一些,使用较多).使用关键字new. B.String内容的比较 // TODO Auto-generated metho ...
- C++学习38 string字符串的增删改查
C++ 提供的 string 类包含了若干实用的成员函数,大大方便了字符串的增加.删除.更改.查询等操作. 插入字符串 insert() 函数可以在 string 字符串中指定的位置插入另一个字符串, ...
- C++学习37 string字符串的访问和拼接
访问字符串中的字符 string 字符串也可以像字符串数组一样按照下标来访问其中的每一个字符.string 字符串的起始下标仍是从 0 开始.请看下面的代码: #include <iostrea ...
- java String字符串——进度1
String字符串 在JAVA中提供了多种创建字符串对象的方法,这里介绍最简单的两种, 第一种是直接赋值, 第二种是使用String类的构造方法: 如下所示: Strin ...
- 关于String字符串反转
这是网上看到的一篇java面试题中的问题: 问题是: 如何将一个String字符串反转. String str = "1234567"; int length = str.leng ...
随机推荐
- 如何在 messager/alert/confirm等消息提示框中 获取 / 设置 嵌入 html内容中的 input[type=checkbox]等的选中状态?
总结, 有3点: 不能/不要 在 这些消息框 / 提示框/ 对话框中的 回调函数中去写代码: 获取嵌入 内容中input.checkbox的选中状态, 因为 虽然在这些框存在的时候, 这个 check ...
- Git本地仓库的使用
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 与 SVN 区别点: 1.Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 S ...
- php 字符串常用函数
数组.字符串和数据库是我们函数里面最.最.最常用的三类函数. 当然PHP的字符串函数也有很多.我们最常使用的两个系列的字符串: 1.单字节字符串处理函数 2.多字节字符串处理函数 3.字符串编码转换函 ...
- 题解 AT4164 【[ABC102A] Multiple of 2 and N】
首先我们先来回忆一下小学一年级就学过的知识:任何一个偶数都是 \(2\) 的倍数,那么我们就可以分成两种情况考虑:奇数和偶数. 对于偶数,我们可以直接将其输出,因为它必定能被 \(2\) 与它自己整除 ...
- 题解 AT5632 【Sum of Two Integers】
在幼儿园的时候,我们就学习过把一个数分成\(a\)与\(b\),我们只需要用计算机来模拟这个过程就可以了. 我们先从奇数开始看起,以\(5\)为例: 我们可以发现,\(5\)可以分成\(1\)和\(4 ...
- C# 串口关闭时主界面卡死原因分析
目录 问题描述 查找原因 SerialPort类Open()方法 SerialPort类Close()方法 死锁原因 解决死锁 总结 问题描述 前几天用SerialPort类写一个串口的测试程序,关闭 ...
- VSCode C语言编程(二)新建项目及编译
添加工作区: 把文件夹在工作区删除: 把HelloWorld模板文件夹解压到工作目录 模板下载(代码解释请看模板里的注释) 添加项目文件夹: 编辑器打开的文件必须与main.c同目录 点击右边编译图标 ...
- JDK线程池和Spring线程池的使用
JDK线程池和Spring线程池实例,异步调用,可以直接使用 (1)JDK线程池的使用,此处采用单例的方式提供,见示例: public class ThreadPoolUtil { private s ...
- 10.3 c++ STL 初步
#include<Windows.h>#include<iostream>#include<algorithm> // sort swap min ma ...
- 文本harry potter的字符统计
实现计算文件中字符的占比和不同单词的个数两项功能,首先将文本文件按行导入到程序中,再通过charAT()函数来实现对单个字符的操作,并用集合来统计字符总数以及不同的字符的个数,进而输出各个字符的个数以 ...