杭电2019多校第一场,Problem I,String 2019

题目描述

Tom has a string containing only lowercase letters. He wants to choose a subsequence of the string whose length is k and lexicographical order is the smallest. It's simple and he solved it with ease.
But Jerry, who likes to play with Tom, tells him that if he is able to find a lexicographically smallest subsequence satisfying following 26 constraints, he will not cause Tom trouble any more.
The constraints are: the number of occurrences of the ith letter from a to z (indexed from 1 to 26) must in [Li,Ri].
Tom gets dizzy, so he asks you for help.

 

输入

The input contains multiple test cases. Process until the end of file.
Each test case starts with a single line containing a string S(|S|≤105)and an integer k(1≤k≤|S|).
Then 26 lines follow, each line two numbers Li,Ri(0≤Li≤Ri≤|S|). 
It's guaranteed that S consists of only lowercase letters, and ∑|S|≤3×105.

 

输出

Output the answer string.
If it doesn't exist, output −1.

样例输入

aaabbb 3
0 3
2 3
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0

样例输出

abb
题解:
将字母下标按字母从前往后依次抽取出来;
然后从前往后依次确定k的每一位应该放的字母;
对于每一位,枚举字母的顺序应该是从a到z,接着判断该字母放上去后是否符合条件,符合则去确定k的下一位字母,不符合则继续循环;
时间复杂度应该是O(26*26*n)。
AC代码:
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e5+50;
 4 int suf_sum[maxn][30],l[30],r[30],used[30],n,k,last;
 5 char str[maxn],res[maxn];
 6 vector<int> letter_index[30];
 7 int main()
 8 {
 9     while(scanf("%s %d",str,&k)!=EOF)
10     {
11         for(int i=0;i<=25;i++){
12             scanf("%d %d",&l[i],&r[i]);
13             letter_index[i].clear();
14         }
15         vector<int> ::iterator head[30];
16         memset(used,0,sizeof(used));
17         n=strlen(str);last=-1;
18         for(int i=0;i<=n;i++) for(int j=0;j<=25;j++) suf_sum[i][j]=0;
19         for(int i=n-1;i>=0;i--){
20             for(int j=0;j<=25;j++){
21                 if(str[i]=='a'+j) suf_sum[i][j]=suf_sum[i+1][j]+1;
22                 else suf_sum[i][j]=suf_sum[i+1][j];
23             }
24         }
25         for(int i=0;i<=n-1;i++){
26             letter_index[str[i]-'a'].push_back(i);
27         }
28         for(int i=0;i<=25;i++){
29             head[i]=letter_index[i].begin();
30         }
31         bool ans=true;
32         for(int i=0;i<=k-1;i++){
33             bool flag=false;
34             for(int j=0;j<=25;j++){
35                 if(used[j]==r[j]) continue;
36                 while(head[j]!=letter_index[j].end() && (*head[j])<=last) head[j]++;
37                 if(head[j]==letter_index[j].end()) continue;
38                 used[j]++;
39                 bool tag=true;
40                 int cnt=0,tmp=0,pos=(*head[j]);
41                 for(int t=0;t<=25;t++){
42                     if(suf_sum[pos+1][t]+used[t]<l[t]) tag=false;
43                     cnt+=max(0,l[t]-used[t]);
44                     tmp+=min(suf_sum[pos+1][t],r[t]-used[t]);
45                 }
46                 if(cnt>k-1-i || tmp<k-1-i) tag=false;
47                 if(!tag) used[j]--;
48                 else{
49                     res[i]='a'+j;
50                     last=pos;
51                     flag=true;
52                     break;
53                 }
54             }
55             if(!flag){
56                 ans=false;
57                 printf("-1\n");
58                 break;
59             }
60         }
61         if(ans){
62             res[k]='\0';
63             printf("%s\n",res);
64         }
65     }
66     return 0;
67 }
68 /*
69 aaccddaa 6
70 2 4
71 0 0
72 2 2
73 0 2
74 0 0
75 0 0
76 0 0
77 0 0
78 0 0
79 0 0
80 0 0
81 0 0
82 0 0
83 0 0
84 0 0
85 0 0
86 0 0
87 0 0
88 0 0
89 0 0
90 0 0
91 0 0
92 0 0
93 0 0
94 0 0
95 0 0
96 */
View Code
 

转载于:https://www.cnblogs.com/lglh/p/11250140.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年最新Python爬虫入门『最强教程』新鲜出炉!

近年来&#xff0c;大数据成为业界与学术界最火热的话题之一&#xff0c;数据已经成为每个公司极为重要的资产。互联网大量的公开数据为个人和公司提供了以往想象不到的可以获取的数据量。而掌握网络爬虫技术可以帮助你获取这些有用的公开数据集。 爬虫能干什么呢&#xff1f;一…

如何使编译的EXE程序能多个运行?

如何使编译的EXE程序能多个运行?方法很简单,把这句话加到EXE对应的INI文件中去allowmultipleinstancesTrue不错吧!:)转载于:https://www.cnblogs.com/Qia_sky/archive/2005/05/18/158119.html

java实现多对多关系的方法_Hibernate一对多关联双向关联代码实现分享

1、创建实体类(Customer.java、Orders.java)package wck.stu.vo.oneToMany_single;import java.util.HashSet;import java.util.Set;public class Customer {private String id "";private String cName "";private String bank "";private S…

使用LUA构建页面

Android&#xff0c;LUA&#xff0c;CoronaCard 使用CoronaCard引擎构建页面&#xff0c;只需要嵌入CoronaView&#xff0c;就可以构建灵活多样的页面。 微游手柄游戏厅 4.0版本&#xff0c;全面改版&#xff0c;使用LUA语言&#xff0c;通过CoronaCard引擎构建。 一 界面效果&…

C#实现Singleton (转载)

您要在 C# 中构建应用程序。您需要只有一个实例的类&#xff0c;并且需要提供一个用于访问实例的全局访问点。您希望确保您的解决方案高效&#xff0c;并且能够利用 Microsoft? .NET 公共语言运行库功能。您可能还希望确保解决方案是线程安全的。 实现策略 尽管 Singleton 是一…

java当中显示紫色_在java中将深色变为亮色

我正在开发一个程序,我从图像的一部分中获取RGB值.我想去除颜色中的黑暗并使其变亮.我所做的是使用Color.RGBtoHSB然后获取亮度通道并将其设置为范围内的最高值,然后将HSB转换回RGB.但是,当我这样做时,颜色会完全改变.这是一个深红色的例子,它变成紫色,我用这个代码.System.out…

iTunes Connect上传APP屏幕快照图片失败 - 您必须上传有效的屏幕快照。

您必须上传有效的屏幕快照。 原因很简单&#xff1a;这个屏幕快照 要用 iPhone截屏才可以&#xff0c;你自已随便在电脑上截个图肯定不行 //------------------------------------------------------------------------------------------------------------------------------…

JQuery VS JS DOM

JQ断断续续的也用了一阵子了.对我来说确实是个小小的突破。之前的javascript 简直是 一塌糊涂。。糊涂到 连:document.getElementById("") 这个语句都不会写。哈哈这也算是选择JQ的一个理由吧&#xff0c;因为JQ 只需要$("#ID") $(".Class") 就可…

java设计模式组合模式详解_《JAVA设计模式》之组合模式(Composite)

在阎宏博士的《JAVA与模式》一书中开头是这样描述合成(Composite)模式的&#xff1a;html合成模式属于对象的结构模式&#xff0c;有时又叫作“部分——总体”模式。合成模式将对象组织到树结构中&#xff0c;能够用来描述总体与部分的关系。合成模式可使客户端将单纯元素与复合…

匹配嵌套的构造(较复杂)

如果还不明白正则表达式中(?:)的使用&#xff0c;请看&#xff1a;http://www.knowsky.com/297.html正则表达式的终极能力 - 递归 今天在QQ问liuzhi如何写一个匹配递归式的正则表达式时&#xff0c;没想到那家伙居然就回答“递归消除”&#xff0c;让我去看编译原理的书。&am…

XAF Excel数据导入模块使用说明与源码

我实现了XAF项目中Excel数据的导入&#xff0c;使用Devexpress 新出的spreadsheet控件&#xff0c;可能也不新了吧:D 好&#xff0c;先看一下效果图&#xff1a;下图是Web版本的。 下面是win版&#xff1a; 功能说明&#xff1a; 支持从Excel任意版本导入数据&#xff0c;可以使…

ASP注入漏洞基础教程(二)

进 阶 篇 在入门篇&#xff0c;我们学会了&#xff33;&#xff31;&#xff2c;注入的判断方法&#xff0c;但真正要拿到网站的保密内容&#xff0c;是远远不够的。接下来&#xff0c;我们就继续学习如何从数据库中获取想要获得的内容&#xff0c;首先&#xff0c;我们先看看&…

java日期用什么属性_java日期以及使用Java反射机制遍历实体类的属性和类型

fmt:formatDate 的输出格式 fmt关于时间格式的输出2004-5-31 23:59:592004-4-123:59:59JSTL标签fmt:formatDate引起的中文乱码问题解决方案解决方法&#xff1a;在后面写上一句&#xff1a;**************************************************Field[] fieldsIssue.class.getDe…

linux 内存清理/释放命令

1.清理前内存使用情况 free -m2.开始清理 echo 1 > /proc/sys/vm/drop_caches3.清理后内存使用情况 free -m4.完成!查看内存条数命令&#xff1a; dmidecode | grep -A16 "Memory Device$" # sync# echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys…

dotnet程序优化心得(三)

&#xff08;4&#xff09;继续优化――用空间换取时间 现在对每一个字符&#xff0c;都要用get_Item(object key)方法过一遍&#xff0c;可这个乖乖方法那么长&#xff0c;肯定太耗时间了&#xff0c;能不能用更简单的手段呢&#xff1f;改Hashtable&#xff1f;哇&#xff0c…

java网页解析包_java 网页解析工具包 Jsoup

Jsoup是一个非常好的解析网页的包&#xff0c;用java开发的&#xff0c;提供了类似DOM&#xff0c;CSS选择器的方式来查找和提取文档中的内容。相关资料如下&#xff1a;今天做了一个Jsoup解析网站的项目&#xff0c;使用Jsoup.connect(url).get()连接某网站时偶尔会出现java.n…

C++/CLI思辨录之传递托管堆地址

新的C特点平衡了把托管堆的地址传递到非托管代码的能力。早期我们遇到的最大问题是&#xff0c;在托管堆中的对象的位置是非静态的。垃圾收集器以变化的时间间隔移动对象。现在新的pin_ptr(别针型指针)的引入禁止垃圾收集器改变在堆上的对象的地址。下面代码展示了别针型指针的…

【Mininet】Mininet使用源码安装

实验参考&#xff1a; Mininet使用源码安装 实验步骤&#xff1a; 1. 更新软件&#xff08;用#sudo apt-get update与#sudo apt-get upgrade&#xff09;。 2. 从github上获取mininet源码&#xff08;#git clone git://github.com/mininet/mininet&#xff09;。 3. 获取完后&a…

java比较字符能用等于号码_Java字符串比较,==,等于,匹配,compareTo()之间的差异。...

的equals()方法将此字符串与指定的对象进行比较。当且仅当参数不为null并且是一个String对象&#xff0c;表示与此对象相同的字符序列时&#xff0c;结果为true。示例public class Sample{public static void main(String []args){String s1 "nhooo";String s2 &qu…