不知道错在哪里。

是要把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. VS #include 【bits/bstdc++.h】出错

    目录 1. 本文地址 2. 按 3. 操作步骤 1. 本文地址 博客园:https://www.cnblogs.com/coco56/p/11163142.html 简书:https://www.ji ...

  2. TensorFlow——MNIST手写数字识别

    MNIST手写数字识别 MNIST数据集介绍和下载:http://yann.lecun.com/exdb/mnist/   一.数据集介绍: MNIST是一个入门级的计算机视觉数据集 下载下来的数据集 ...

  3. CentOS 7系统安装nginx+php

    安装介绍1.系统环境CentOS7 2.nginx版本1.12 3.PHP版本7.2 下载地址 4.MySQL版本5.7 安装nginx添加centos7的 nginx yum源 然后执行安装 sud ...

  4. window x86编译openssl vs2013

    1.下载OpenSSL,http://www.openssl.org/source/(Feb 8 18:29:10 2011 openssl-.0.0d.tar.gz[LATEST] ),winrar ...

  5. 容器(collection)初步

    容器(集合)的分类: 泛型(generic):本质是数据类型的参数化(提前告诉编译器,在调用泛型时必须传入实际类型) 例:E即为在主函数中定义的传入的实际类型 class MyCollection&l ...

  6. pandas学习(一)

    pandas.DataFrame.sort_index 用法 sort_index(axis=0, level=None, ascending=True, inplace=False, kind='q ...

  7. mysql导出数据到csv文件

    在日常工作中经常会遇见导出表中的数据到csv文件的操作,这里就简单总结一下导出的操作. 下面对csv文件的描述是摘录: 据RFC4180文档设置的,该文档全称Common Format and MIM ...

  8. U盘安装win8(win7)+centos7双系统

    centos7除了之后,就像尝鲜看看,但是发现安装之后会失去win8启动项.导致重装系统,经过反复折腾,终于搞定了,发出来共享下.默认你的 window系统已经安装好,不介绍window安装过程.本文 ...

  9. Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...

  10. (转)Installing Cloudera Manager and CDH

    转:https://blog.csdn.net/qq_26222859/article/details/79976506 译自官网: Installing Cloudera Manager and C ...