题意

链接:https://vjudge.net/problem/HDU-6586

给你一个字符串和k,还有每个字符出现次数的限制,求一个长度为k的字典序最小的满足限制的子序列。

思路

先构造出序列自动机,顺带把num(i,j)(下标为i后面的字符为j的个数)求出来。

题目要求字典序最小,我们就贪心的对每一位每次从a~z枚举,check是否满足。

check(x,y,t):第x位放字符y且第x-1位是原串的下标t所表示的字符。要满足以下几点:

  1. 用过的字符y的数量+1<=r[y]
  2. t后面要有j字符
  3. 每一个字符需要的位置个数和(即∑l[i]-vis[i])<=k-x
  4. 每一个字符当前用过的数量+y字符后面的每一个字符还剩的数量>=每个字符的下限

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
char str[N];
char s[N];
int nxt[N][30],l[N],r[N],num[N][30];
int vis[N],k;
char ans[N];
void getnext()
{
memset(nxt, 0, sizeof(nxt));//初始化为0代表i位置之后没有该字符
memset(num,0,sizeof(num));
memset(vis,0,sizeof(vis));
int len = strlen(str + 1);//长度相应的从1下标开始
for(int i = len; i >= 1; i --)
{
for(int j = 0; j < 26; j ++)
{
nxt[i - 1][j] = nxt[i][j];//str i-1位置继承str i位置的离其它字符最近的位置是第几个
num[i-1][j]=num[i][j];
}
nxt[i - 1][str[i] - 'a'] = i;// str i-1位置离str[i]字符的最近位置变为第i个.
num[i-1][str[i] - 'a']++;
}
}
bool check(int x,int y,int t)
{
if(vis[y]+1>r[y]) return 0; //超过上限
vis[y]++;
int need=0;
int now=nxt[t][y];
if(now==0)
{
vis[y]--;
return 0;
}
for(int i=0;i<26;i++)
{
need+=max(0,l[i]-vis[i]);
}
if(need>k-x)
{
vis[y]--;
return 0;
}
for(int i=0;i<26;i++)
{
if(vis[i]+num[now][i]<l[i])
{
vis[y]--;
return 0;
}
}
return 1;
}
int main()
{
while(~scanf(" %s %d", str + 1,&k))
{
getnext(); //获得序列自动机的next数组
for(int i=0;i<26;i++)
scanf("%d%d",&l[i],&r[i]);
int pre=0,gg=0;
for(int i=1;i<=k;i++)
{
int flag=0;
for(int j=0;j<26;j++)
{
if(check(i,j,pre))
{
pre=nxt[pre][j];
ans[i]=j+'a';
flag=1;
break;
}
}
if(!flag)
{
gg=1;
break;
}
}
if(gg)
puts("-1");
else
{
ans[k+1]='\0';
printf("%s\n",ans+1);
}
} return 0;
}

2019 Multi-University Training Contest 1 String(序列自动机+贪心)的更多相关文章

  1. 2018 Multi-University Training Contest 1 Distinct Values 【贪心 + set】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6301 Distinct Values Time Limit: 4000/2000 MS (Java/Ot ...

  2. Hdu 4681 2013 Multi-University Training Contest 8 String

    带跨越式的LCS,同样是在朴素的LCS上加入一种跨越一段的转移,这样我们要预处理出跨越一段给定串的转移函数. 这个题同样可以正反两边LCS做 呆马: #include <iostream> ...

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

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

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

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

  5. 2019 Multi-University Training Contest 4.Divide the Stones(贪心)

    题意:给你n和k (k|n) 有n个数 第i个数权值为i 要你求权值相同且分成k组 且每组的个数为n/k 思路:恶心构造题,首先对于总权值不能分为k份的 显然不能分成 然后 我们把n/k 分奇偶 我们 ...

  6. 2018 Multi-University Training Contest 1 Balanced Sequence(贪心)

    题意: t组测试数据,每组数据有 n 个只由 '(' 和 ')' 构成的括号串. 要求把这 n 个串排序然后组成一个大的括号串,使得能够匹配的括号数最多. 如()()答案能够匹配的括号数是 4,(() ...

  7. 2015 Multi-University Training Contest 8 hdu 5385 The path

    The path Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID: 5 ...

  8. 2019 Multi-University Training Contest 1

    2019 Multi-University Training Contest 1 A. Blank upsolved by F0_0H 题意 给序列染色,使得 \([l_i,r_i]\) 区间内恰出现 ...

  9. 2019 Multi-University Training Contest 2

    2019 Multi-University Training Contest 2 A. Another Chess Problem B. Beauty Of Unimodal Sequence 题意 ...

随机推荐

  1. 【一】Gradle 初识

    1.Gradle和Maven的对比 gradle 使用groovy语言,可以进行逻辑判断,maven基于xml,无法进行逻辑判断. gradle 可以在一个项目中,根据需求,生成2个不同的jar, m ...

  2. 对比keep-alive路由缓存设置的2种方式

    方式有两种 .路由元信息(2.1.0版本之前) .属性方式(2.1.0版本之后新增) Vue2.1.0之前: 想实现类似的操作,你可以: 配置一下路由元信息 创建两个keep-alive标签 使用v- ...

  3. day87_11_7微信小程序之登录,支付(获取ip,requests使用),授权

    一.登录接口. 官方文档https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 在登录接口 ...

  4. 【转】【好文章】更愉快的写css

    我在写CSS的时候经常会碰到些麻烦事儿: 1)看上去蛮简单的排版却写了很久 2)代码写的越来越散,总是这里补一句,那里补一句,没有条理性 3)margin.padding.font-size等属性在不 ...

  5. acwing 49. 二叉搜索树与双向链表

    地址:https://www.acwing.com/problem/content/87/ 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表. 要求不能创建任何新的结点,只能调整树中结点指针 ...

  6. P4728 [HNOI2009]双递增序列

    题意 这个DP状态有点神. 首先考虑一个最暴力的状态:\(f_{i,j,k,u}\)表示第一个选了\(i\)个,第二个选了\(j\)个,第一个结尾为\(k\),第二个结尾为\(u\)是否可行. 现在考 ...

  7. WPF (DataGridColumnHeader)实现自义定列头样式 并绑定数据

    原文:WPF (DataGridColumnHeader)实现自义定列头样式 并绑定数据 实现功能是这样的 自定义列头 样式 样式里的 数据来源于后台绑定 这篇就说头样式 和头样式数据绑定 思路 1) ...

  8. matlab练习程序(图像投影到点云)

    最近接触点云比较多,如果把图像投影到点云应该挺有意思. 首先需要载入图像,然后做个球或其他什么形状的点云,这里可以参考球坐标公式. 最后通过pcshow将像素输出到点云上即可. 原图: 投影后的点云: ...

  9. [题解向] Manacher简单习题

    \(1\) LG1659 [国家集训队]拉拉队排练 求前\(k\)大的奇数长度回文串的长度之积. \(\rm |S|\leq 1e6,K\leq 1e12\) --一开始觉得挺水,就开始二分最少长度能 ...

  10. hashlib和hmac模块

    目录 一.hashlib模块 1.0.1 hash是什么 1.0.2 撞库破解hash算法加密 一.hashlib模块 1.0.1 hash是什么 hash是一种算法(Python3.版本里使用has ...