题目描述

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.

样例输入

  1. aaabbb 3
  2. 0 3
  3. 2 3
  4. 0 0
  5. 0 0
  6. 0 0
  7. 0 0
  8. 0 0
  9. 0 0
  10. 0 0
  11. 0 0
  12. 0 0
  13. 0 0
  14. 0 0
  15. 0 0
  16. 0 0
  17. 0 0
  18. 0 0
  19. 0 0
  20. 0 0
  21. 0 0
  22. 0 0
  23. 0 0
  24. 0 0
  25. 0 0
  26. 0 0
  27. 0 0

样例输出

  1. abb
  2. 题解:
    将字母下标按字母从前往后依次抽取出来;
    然后从前往后依次确定k的每一位应该放的字母;
    对于每一位,枚举字母的顺序应该是从az,接着判断该字母放上去后是否符合条件,符合则去确定k的下一位字母,不符合则继续循环;
    时间复杂度应该是O(26*26*n)。
    AC代码:
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e5+;
  4. int suf_sum[maxn][],l[],r[],used[],n,k,last;
  5. char str[maxn],res[maxn];
  6. vector<int> letter_index[];
  7. int main()
  8. {
  9. while(scanf("%s %d",str,&k)!=EOF)
  10. {
  11. for(int i=;i<=;i++){
  12. scanf("%d %d",&l[i],&r[i]);
  13. letter_index[i].clear();
  14. }
  15. vector<int> ::iterator head[];
  16. memset(used,,sizeof(used));
  17. n=strlen(str);last=-;
  18. for(int i=;i<=n;i++) for(int j=;j<=;j++) suf_sum[i][j]=;
  19. for(int i=n-;i>=;i--){
  20. for(int j=;j<=;j++){
  21. if(str[i]=='a'+j) suf_sum[i][j]=suf_sum[i+][j]+;
  22. else suf_sum[i][j]=suf_sum[i+][j];
  23. }
  24. }
  25. for(int i=;i<=n-;i++){
  26. letter_index[str[i]-'a'].push_back(i);
  27. }
  28. for(int i=;i<=;i++){
  29. head[i]=letter_index[i].begin();
  30. }
  31. bool ans=true;
  32. for(int i=;i<=k-;i++){
  33. bool flag=false;
  34. for(int j=;j<=;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=,tmp=,pos=(*head[j]);
  41. for(int t=;t<=;t++){
  42. if(suf_sum[pos+][t]+used[t]<l[t]) tag=false;
  43. cnt+=max(,l[t]-used[t]);
  44. tmp+=min(suf_sum[pos+][t],r[t]-used[t]);
  45. }
  46. if(cnt>k--i || tmp<k--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 ;
  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. */
  1.  

杭电2019多校第一场,Problem I,String 2019的更多相关文章

  1. 【2019多校第一场补题 / HDU6578】2019多校第一场A题1001Blank——dp

    HDU6578链接 题意 有一串字符串,仅由 {0,1,2,3}\{0, 1, 2, 3\}{0,1,2,3} 组成,长度为 nnn,同时满足 mmm 个条件.每个条件由三个整数组成:l.r.xl.r ...

  2. 2019年杭电多校第一场 1009题String(HDU6586+模拟+单调栈)

    题目链接 传送门 题意 给你一个字符串,要你构造一个长为\(k\)的子串使得每个字母出现的次数在\([L_i,R_i](0\leq i\leq26)\)间且字典序最小. 思路 做这种题目就是要保持思路 ...

  3. 【2019多校第一场补题 / HDU6582】2019多校第一场E题1005Path——最短路径+网络流

    HDU6582链接 题意 在一张有向图中,有一个起点和一个终点,你需要删去部分路径,使得起点到终点的最短距离增加(并不要求需要使得距离变成最大值),且删除的路径长度最短.求删去的路径总长为多少 分析 ...

  4. 2018 Multi-University Training Contest 1 杭电多校第一场

    抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001  Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...

  5. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  6. 2019年牛客多校第一场B题Integration 数学

    2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...

  7. 牛客多校第一场 B Inergratiion

    牛客多校第一场 B Inergratiion 传送门:https://ac.nowcoder.com/acm/contest/881/B 题意: 给你一个 [求值为多少 题解: 根据线代的知识 我们可 ...

  8. HDU6581 Vacation (HDU2019多校第一场1004)

    HDU6581 Vacation (HDU2019多校第一场1004) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6581 题意: 给你n+1辆汽车, ...

  9. 2019HDU多校第一场1001 BLANK (DP)(HDU6578)

    2019HDU多校第一场1001 BLANK (DP) 题意:构造一个长度为n(n<=10)的序列,其中的值域为{0,1,2,3}存在m个限制条件,表示为 l r x意义为[L,R]区间里最多能 ...

随机推荐

  1. javaweb和数据库的简易商城系统

    这是一个基于Javaweb和数据库的简易商城系统.为大二夏季小学期完成. 目录结构 主要功能截图为: 一.购买用户 1.首页(除此界面其余界面访问需要登录才能进入) 查看商品 添加购物车 查看购物车 ...

  2. mybatis 语句中where 后边要跟必要条件和多个选择条件处理方法

    <select id="serchRelation" resultType="Relation">SELECTr.node_one as nodeO ...

  3. springboot 配置跨越访问

    import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.H ...

  4. 预处理、const、static与sizeof-为什么不把所有的函数都定义成内联函数

    1:内联是以代码膨胀(复制)为代价的,仅仅省去了函数调用的开销,从而提高函数的执行效率.如果执行函数体内代码的时间相比于函数调用的开销较大,那么效率的收获会很小.另一方面,每一处内联函数的调用都要复制 ...

  5. yum异常: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404 Not Found"

    http://people.centos.org/hughesjr/chromium/6/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 ...

  6. CSS 实现对号效果

    实现对号效果,一种思路是利用现成的符号,直接在网上搜索到 √,插入页面.另一种思路是本文要介绍的用 CSS 实现,思路是: 给块级元素设置宽度和高度 设置元素相邻的两个 border 旋转元素 HTM ...

  7. python 字符串(str)和列表(list)的互相转换

    1.str to list  str1 = "12345"list1 = list(str1)print list1 str2 = "123 sjhid dhi" ...

  8. Python之Javascript

    1.JavaScript 被设计用来向 HTML 页面添加交互行为. 2.JavaScript 是一种脚本语言(脚本语言是一种轻量级的编程语言). 3.JavaScript 由数行可执行计算机代码组成 ...

  9. Navicat 12 for MySQL最新版激活(注册机)(转)(亲测有效)

    Navicat 12 for MySQL最新版激活(注册机)(转)(亲测有效) 一.总结 一句话总结: 1.卸载自己机器上面的Navicat,安装下载的包里面的Navicat安装包,不然可能不行 2. ...

  10. 【Java】给整数加上千分位分隔符

    package com.testEmp; import java.text.DecimalFormat; public class NumberFormat { public static void ...