不知道错在哪里。

是要把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. Python Paramiko模块使用

    1 执行远程命令 #!/usr/bin/python import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_polic ...

  2. maven 常用插件 拷贝依赖 拷贝jar包 查看属性 环境变量

    1 maven编译后希望将生产的jar包拷贝到指定目录 在pom中配置maven插件 maven-antrun-plugin <build > <plugins> <pl ...

  3. Java实现代理服务器

    Web代理(proxy)服务器是网络的中间实体. 代理位于Web客户端和Web服务器之间,扮演"中间人"的角色. HTTP的代理服务器即是Web服务器又是Web客户端. 代理服务器 ...

  4. 【leetcode】1048. Longest String Chain

    题目如下: Given a list of words, each word consists of English lowercase letters. Let's say word1 is a p ...

  5. element中的表格处理:循环出表格数据

    最近要做一个表格,但是为了方便维护,我们需要把表格数据循环出来,方便加减节点: <template> <el-table :data="tableData" st ...

  6. 基于Nginx和uWSGI在Ubuntu上部署Django项目

    前言: 对于做Django web项目的童鞋,重要性不言而喻. 参考:https://www.cnblogs.com/alwaysInMe/p/9096565.html https://blog.cs ...

  7. 用java实现文件的断点续传并发下载

    需求: 支持文件批量下载.现在有很多小图片需要批量下载,不希望在服务器打包下载. 支持大文件断点下载.比如下载10G的文件. PC端全平台支持.Windows,macOS,Linux 全浏览器支持.i ...

  8. iOS设计模式之适配器模式

    一,适配器的定义 定义 将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 需求场景 需要使用以前开发的“一些现存的对象”,但是新环境中要求 ...

  9. QT | 第二章 基本语法

    ''' @Modify Time @Author ------------ ------- python基本语法 2019/10/26 8:16 laoalo ''' import functools ...

  10. 关于BSP,BIOS,和bootloader

    BSP是板级支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板.BSP是相对于操作系统而言的,不同的操作系统对应于不同定 ...