不知道错在哪里。

是要把atop改成stop!两个弄混了。感谢自造样例。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; int n, k;
char s[100005];
int cnt[100005][26]; deque<int> pos[26]; int l[26];
int r[26];
int used[26]; char ans[100005], atop; bool check1(int id) {
//能不能放够下界
//id表示剩余序列的起始位置
int restlen = k - atop;
int sumli = 0;
for(int i = 0; i < 26; ++i) {
if(cnt[id][i] < l[i] - used[i])
return false;
sumli += l[i] - used[i];
}
if(sumli > restlen)
return false;
//上界加起来够不够放满?
int sumri = 0;
for(int i = 0; i < 26; ++i) {
sumri += r[i] - used[i];
}
if(sumri < restlen)
return false;
return true;
} int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
while(~scanf("%s%d", s + 1, &k)) {
for(int i = 0; i < 26; ++i) {
pos[i].clear();
used[i] = 0;
}
n = strlen(s + 1);
for(int i = 1; i <= n; ++i) {
pos[s[i] - 'a'].push_back(i);
for(int j = 0; j < 26; ++j) {
cnt[i][j] = 0;
}
++cnt[i][s[i] - 'a'];
}
for(int i = n - 1; i >= 1; --i) {
for(int j = 0; j < 26; ++j) {
cnt[i][j] += cnt[i + 1][j];
}
}
for(int i = 0; i < 26; ++i) {
scanf("%d%d", &l[i], &r[i]);
}
atop = 0;
bool suc2 = true;
while(atop < k) {
++atop;
//给第1个位置选
bool suc = false;
for(int i = 0; i < 26; i++) {
while(pos[i].size() && pos[i].front() < atop)
pos[i].pop_front(); if(used[i] < r[i] && pos[i].size()) {
used[i]++;
if(check1(pos[i].front() + 1)) {
suc = true;
ans[atop] = 'a' + i;
ans[atop + 1] = '\0';
pos[i].pop_front();
break;
}
used[i]--;
}
}
if(!suc) {
suc2 = false;
break;
}
}
if(suc2)
printf("%s\n", ans + 1);
else
puts("-1");
}
}

有一个可以导致出错的样例:

abcdeabcdeabcdeabcdeabcdeabcde 14
0 3
2 3
3 5
3 5
3 7
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

目前通过的代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; int n, k;
char s[100005];
int cnt[100005][26]; deque<int> pos[26]; int l[26], r[26], used[26]; char ans[100005]; int atop, stop; bool check1(int id) {
//能不能放够下界
//id表示剩余序列的起始位置
int restlen = k - atop;
int sumli = 0;
for(int i = 0; i < 26; ++i) {
if(cnt[id][i] < l[i] - used[i])
return false;
sumli += max(l[i] - used[i], 0);
}
if(sumli > restlen)
return false;
//上界加起来够不够放满?
int sumri = 0;
for(int i = 0; i < 26; ++i) {
sumri += min(r[i] - used[i], cnt[id][i]);
}
if(sumri < restlen)
return false;
return true;
} int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
while(~scanf("%s%d", s + 1, &k)) {
memset(used, 0, sizeof(used));
n = strlen(s + 1);
for(int i = 0; i < 26; ++i) {
pos[i].clear();
used[i] = 0;
cnt[n + 1][i] = 0;
}
for(int i = 1; i <= n; ++i) {
pos[s[i] - 'a'].push_back(i);
for(int j = 0; j < 26; ++j) {
cnt[i][j] = 0;
}
++cnt[i][s[i] - 'a'];
} for(int i = n - 1; i >= 1; --i)
for(int j = 0; j < 26; ++j)
cnt[i][j] += cnt[i + 1][j];
for(int i = 0; i < 26; ++i)
scanf("%d%d", &l[i], &r[i]); atop = 0;
stop = 0;
bool suc2 = true;
while(atop < k) {
++atop;
//给第1个位置选
bool suc = false;
for(int i = 0; i < 26; i++) {
while(pos[i].size() && pos[i].front() <= stop)
pos[i].pop_front(); if(used[i] < r[i] && pos[i].size()) {
used[i]++;
if(check1(pos[i].front() + 1)) {
suc = true;
ans[atop] = 'a' + i;
ans[atop + 1] = '\0';
stop = pos[i].front();
pos[i].pop_front();
break;
}
used[i]--;
}
}
if(!suc) {
suc2 = false;
break;
}
}
ans[k + 1] = '\0';
if(suc2)
printf("%s\n", ans + 1);
else
puts("-1");
}
}

2019 Multi-University Training Contest 1 - 1009 - String - 贪心的更多相关文章

  1. 2019 Multi-University Training Contest 2 - 1009 - 回文自动机

    http://acm.hdu.edu.cn/showproblem.php?pid=6599 有好几种实现方式,首先都是用回文自动机统计好回文串的个数. 记得把每个节点的cnt加到他的fail上,因为 ...

  2. 2015 Multi-University Training Contest 1 - 1009 Annoying problem

    Annoying problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5296 Mean: 给你一个有根树和一个节点集合 ...

  3. 2014 Multi-University Training Contest 9#1009

    Just a JokeTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Tot ...

  4. hdu 6394 Tree (2018 Multi-University Training Contest 7 1009) (树分块+倍增)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=6394 思路:用dfs序处理下树,在用分块,我们只需要维护当前这个点要跳出这个块需要的步数和他跳出这个块去 ...

  5. HDU 4608 I-number 2013 Multi-University Training Contest 1 1009题

    题目大意:输入一个数x,求一个对应的y,这个y满足以下条件,第一,y>x,第二,y 的各位数之和能被10整除,第三,求满足前两个条件的最小的y. 解题报告:一个模拟题,比赛的时候确没过,感觉这题 ...

  6. 2015 Multi-University Training Contest 5 1009 MZL's Border

    MZL's Border Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5351 Mean: 给出一个类似斐波那契数列的字符串序列 ...

  7. ACM多校联赛7 2018 Multi-University Training Contest 7 1009 Tree

    [题意概述] 给一棵以1为根的树,树上的每个节点有一个ai值,代表它可以传送到自己的ai倍祖先,如果不存在则传送出这棵树.现在询问某个节点传送出这棵树需要多少步. [题解] 其实是把“弹飞绵羊”那道题 ...

  8. 2019 Nowcoder Multi-University Training Contest 4 E Explorer

    线段树分治. 把size看成时间,相当于时间 $l$ 加入这条边,时间 $r+1$ 删除这条边. 注意把左右端点的关系. #include <bits/stdc++.h> ; int X[ ...

  9. 2019 Nowcoder Multi-University Training Contest 1 H-XOR

    由于每个元素贡献是线性的,那么等价于求每个元素出现在多少个异或和为$0$的子集内.因为是任意元素可以去异或,那么自然想到线性基.先对整个集合A求一遍线性基,设为$R$,假设$R$中元素个数为$r$,那 ...

随机推荐

  1. Tomcat部署虚拟主机

    使用Tomcat部署加密虚拟主机,实现: a.使用www.a.com域名访问的页面根路径为/usr/local/tomcat/a/base b.使用www.b.com域名访问的页面根路径为/usr/l ...

  2. javaweb各种框架组合案例(六):springboot+spring data jpa(hibernate)+restful

    一.介绍 1.springboot是spring项目的总结+整合 当我们搭smm,ssh,ssjdbc等组合框架时,各种配置不胜其烦,不仅是配置问题,在添加各种依赖时也是让人头疼,关键有些jar包之间 ...

  3. 04机器学习实战之朴素贝叶斯scikit-learn实现

    In [8]: import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl from sklearn.pre ...

  4. VNware上安装虚拟机Ubuntu16.10 并安装petalinux(版本问题的坑 弃帖 另开一帖)

    1.下载Ubuntu镜像文件 最新版本:https://ubuntu.com/download/desktop 老版本:http://old-releases.ubuntu.com/releases/ ...

  5. java.nio.channels.IllegalBlockingModeException

    报错信息如下: Exception in thread "main" java.nio.channels.IllegalBlockingModeException at java. ...

  6. eclipse 报错:One or more constraints have not been satisfied.

    接受 我有同样的问题.在我的maven项目中添加速度依赖关系后,我在标记选项卡中得到相同的错误.然后我注意到maven项目创建的web.xml文件具有servlet2.3模式.当我将其更改为servl ...

  7. 大白话vue——slot的作用与使用

    这篇内容本来是不打算放在首页上的,因为内容实在是比较简单,但是在查找slot的使用讲解时发现相关的讲解比较少,要么像官方文档一样简单讲解(看过任然一脸懵逼),也许是自己理解能力比较差...所以在此讲述 ...

  8. 2019 上海网络赛 F Rhyme scheme (字典树DP)

    题目:https://nanti.jisuanke.com/t/41414 题意:求长度为n的第k个bell number  ,  就是第i位的选取范围在 1-(i-1)位的最大值 +1,第一位固定为 ...

  9. [CSP-S模拟测试]:trade(反悔贪心)

    题目传送门(内部题62) 输入格式 第一行有一个整数$n$.第二行有$N$个整数:$a_1\ a_2\ a_3\cdot\cdot\cdot a_n$. 输出格式 一行一个整数表示最大收益. 样例 样 ...

  10. 利用AddressBook.framework框架获取iOS系统通讯录数据

    此方法是使用AddressBook.framework框架获取通讯录信息 第一步.在info.plist文件里面配置访问权限 第二步.导入头文件 #import <AddressBook/Add ...