题意:给定一个由小写字母组成的字符串S,要求从中选出一个长度为k的子序列,使得其字典序最小,并且第i个字母在子序列中出现的次数在[l[i],r[i]]之间

n,k<=1e5

思路:大概就是记一下后缀和然后逐位确定,把能想到的界都给卡上

这种题写错的话大概随机数据拍都能拍出来,就是调起来占大量机时并且体感极差就是了

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef pair<ll,int>P;
#define N 110000
#define M 151000
#define fi first
#define se second
#define MP make_pair
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const ll MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
ll INF=1e18;
ll inf=5e13;
int dx[]={-,,,};
int dy[]={,,-,}; int s[N][],nxt[N][],ans[N],l[N],r[N],t[],a[],n,K;
char ch[N]; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} int isok(int x,int y,int z)
{
int t=nxt[x][z];
//printf("x=%d y=%d z=%d t=%d\n",x,y,z,t);
if(t==n+) return ;
//if(K-y>n-t) return 0;
if(a[z]+>r[z]) return ;
a[z]++;
//rep(i,0,3) printf("%d ",a[i]);
//printf("\n");
int tmp=;
rep(i,,) tmp+=min(s[t+][i],r[i]-a[i]);
//printf("tmp1=%d\n",tmp);
if(tmp<K-y)
{
a[z]--;
return ;
} rep(i,,)
if(a[i]+min(s[t+][i],min(n-t,K-y))<l[i])
{
a[z]--;
return ;
} tmp=;
rep(i,,) tmp+=max(,l[i]-a[i]);
//printf("tmp2=%d\n",tmp);
if(tmp>n-t||tmp>K-y)
{
a[z]--;
return ;
}
a[z]--;
return ;
} int main()
{
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
while(scanf("%s",ch+)!=EOF)
{
n=strlen(ch+),K=read();
if(K==) break;
rep(i,,) t[i]=n+;
rep(i,,) s[n+][i]=;
per(i,n,)
{
int x=;
if(i) x=ch[i]-'a';
rep(j,,) nxt[i][j]=t[j];
t[x]=i;
rep(j,,) s[i][j]=s[i+][j];
s[i][x]++;
}
rep(i,,) l[i]=read(),r[i]=read();
int flag=;
rep(i,,K) ans[i]=;
rep(i,,) a[i]=;
int now=;
rep(i,,K)
{
int k=;
rep(j,,)
if(isok(now,i,j)){k=j; now=nxt[now][j]; a[j]++; break;} if(k==){flag=; break;}
ans[i]=k;
//printf("ans%d=%d now=%d\n",i,k,now);
}
//printf("flag=%d\n",flag);
if(flag)
{
rep(i,,K) printf("%c",ans[i]+'a');
printf("\n");
}
else printf("-1\n");
} return ;
}

【HDOJ6586】String(枚举)的更多相关文章

  1. HDU-4681 String 枚举+DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 题意:给A,B,C三个串,求一个最长的串D,满足D是A和B的subsequence,C是D的su ...

  2. LA 3602 - DNA Consensus String 枚举

    原题地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  3. Item 30 用enum代替int常量类型枚举,string常量类型枚举

    1.用枚举类型替代int枚举类型和string枚举类型 public class Show {   // Int枚举类型   // public static final int APPLE_FUJI ...

  4. Swift----函数 、 闭包 、 枚举 、 类和结构体 、 属性

    1 数组排序 1.1 问题 本案例实现一个整型数组排序的函数,数组排序的规则由传递的规则函数决定. 1.2 方案 首先定义一个整型数组排序函数sortInts,该函数有一个整型数组类型的参数,该参数必 ...

  5. [Effective Java]第六章 枚举和注解

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. iOS - Swift Enum 枚举

    1.Enum 的创建 1.1 标准定义 枚举的定义 enum CompassPoint { case North case South case East case West } enum Plane ...

  7. 【转】掌握java枚举类型(enum type)

    原文网址:http://iaiai.iteye.com/blog/1843553 1   背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...

  8. Effective Java 第三版——34. 使用枚举类型替代整型常量

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. Java学习--枚举

    枚举类型enum,地位等同于class,interface 使用enum定义的枚举类型,也是一种变量类型,可用于声明变量 枚举的一些特征 1.它不能有public的构造函数,这样做可以保证客户代码没有 ...

  10. java基础41 枚举(类)

    1.概述 枚举:一些方法在运行时,它需要数据不能是任意的,而必须是一定范围内的值,可以使用枚举解决 2.枚举的格式 enum 类名{ 枚举值 } 例子 package com.dhb.enumerat ...

随机推荐

  1. HTML-字符实体,平方米(㎡)m²

    转载自:https://blog.csdn.net/hangGe0111/article/details/80983250

  2. UCenter 与 DIscuz 通信失败的解决方法

    问题状况:Discuz 用户无法成功修改头像且帖子中上传的图片无法保存.进入 Discuz 后台检查,一切正常:进入 UCenter 检查后发现在"应用管理"中与 Discuz 论 ...

  3. 【ABAP系列】SAP ABAP 如何控制Dialog中的键盘(回车)功能

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 如何控制Dia ...

  4. HTML表格<tr>行距调整

    CSS文件中: .myTable tr{     display:block; /*将tr设置为块体元素*/     margin-bottom:5px;}

  5. LinkedList -链表集合

    package cn.learn.collection; import java.util.LinkedList; import java.util.Queue; /* java.util.xxx A ...

  6. flask为blueprint增加error_handler

    对整个app增加errorhandler,只需如下: @portal_page.errorhandler(404) def page_not_found(error): cats = Category ...

  7. Lua中C API栈操作

    向栈中压入数据: lua_pushnil(lua_State*); lua_pushboolean(lua_State*, bool); lua_pushnumber(lua_State*, lua_ ...

  8. 2019 最新 Java 核心技术教程,都在这了!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新. Java 基础篇 ...

  9. HDU 4012 Paint on a Wall(状压+bfs)

    Paint on a Wall Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) ...

  10. 问题处理——"无法导航到插入符号下的符号"

    最近编码时经常发现"转到定义"功能没法用了,代码一片灰.刚开始时重新编译一下项目或重启一下VS就恢复了,但到后面这两种方法都不管用了. 偶然下发现解决方案中很多项目的引用都出现了黄 ...