Codeforces 1009G
题意略。
思路:
首先是贪心, 我们从前往后依次从小到大考虑放哪个字符, 重点是判断放了这个字符后, 对于剩下的后缀是否存在合法解。
考虑每个位置的允许放的字符集合只有2 ^ 6种, 我们预处理一个后缀和f[i][j], 表示i~n中被集合j包含的个数。
考虑第i个位置放了字符c后, 要使得f[i+1][j]都 <= 对应的剩下的个数才能是合法的。
这里涉及到一个霍尔定理:二部图G中的两部分顶点组成的集合分别为X, Y;
G中有一组无公共点的边,一端恰好为组成X的点的充分必要条件是:X中的任意k个点至少与Y中的k个点相邻。
由于是选择任意k个(1 <= k <= |x|),所以我们需要考虑的是极端情况,如果极端情况满足了,那么剩余的情况也会被满足。
现在假设我们在当前位置填上了某个字符,我们最关心的是剩下能否合法,也就是剩下的位置能否被剩余字符填满。
其实所有的位置可以分为2 ^ 6 = 64种,如果我们选择的k个来自不同的种类,也就会给我们带来更多可以填入这k个位子的字符。
我所说的极端情况就是尽量减少可以填入这k个位子的字符,扩大我的k个位子。如果这种情况可以被满足,那么其他情况自然也就满足了。
开始我认为选择来自同一种的位子就是最极端的,其实这仅仅做到了字符数最小,没有做到位子最多。
比如我选择了状态为j的位子,我可以选择j的子集来扩大我的k,而且这不会给字符数带来任何增益。
详见代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn1 = 1e5 + ;
const int maxn2 = (<<); int f[maxn1][maxn2],mask[maxn1],cnt[maxn2],m;
char str[maxn1],tmp[],ans[maxn1]; int main(){
scanf("%s%d",str,&m);
int len = strlen(str);
if(m == ){
sort(str,str + len);
printf("%s\n",str);
return ;
}
for(int i = ;i < len;++i){
for(int j = ;j < maxn2;++j){
if(j & (<<(str[i] - 'a'))) ++cnt[j];
}
}
for(int i = ;i <= len;++i) mask[i] = maxn2 - ;
int pos;
for(int i = ;i < m;++i){
scanf("%d%s",&pos,tmp);
int l = strlen(tmp);
mask[pos] = ;
for(int j = ;j < l;++j)
mask[pos] += (<<(tmp[j] - 'a'));
}
for(int i = len;i >= ;--i){
for(int j = ;j < maxn2;++j){
f[i][j] = f[i + ][j];
if((mask[i] & j) == mask[i]) f[i][j] += ;
}
}
for(int i = ;i <= len;++i){
bool finish = false;
for(int j = ;j < ;++j){
if((mask[i] & (<<j)) == || !cnt[<<j]) continue;
bool ok = true;
for(int k = ;k < maxn2 && ok;++k){
if(f[i + ][k] > cnt[k] - ((k>>j) & )){
ok = false;
}
}
if(ok){
for(int k = ;k < maxn2;++k)
if((k>>j) & ) cnt[k] -= ;
ans[i] = 'a' + j;
finish = true;
break;
}
}
if(!finish){
printf("Impossible\n");
return ;
}
}
for(int i = ;i <= len;++i) printf("%c",ans[i]);
printf("\n");
return ;
}
Codeforces 1009G的更多相关文章
- Codeforces 1009G Allowed Letters 最大流转最小割 sosdp
Allowed Letters 最直观的想法是贪心取, 然后网络流取check可不可行, 然后T了. 想到最大流可以等于最小割, 那么我们状压枚举字符代表的6个点连向汇点是否断掉, 然后再枚举64个本 ...
- Codeforces 1009G Allowed Letters FMT,二分图,二分图匹配,霍尔定理
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1009G.html 题目传送门 - CF1009G 题意 给定一个长度为 $n$ 的字符串 $s$ .并给定 ...
- Allowed Letters CodeForces - 1009G(状压思维)
题意: 给出一个字符串 给出几个定点必须是哪个字母(或者是几个字母中的一个) 然后求在满足所有定点后的最小字符串 解析: 没错 这题是暴力 用状压暴力 “a - f” 用”0 - 5“ 这几个数字代 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
随机推荐
- php框架内的数据库操作(微擎,tp,yii2)
微擎数据库操作 关键字 查询 pdo_get pdo_getcolumn pdo_getall pdo_getslice pdo_fetchcolumn pdo_fetchall 示例: array ...
- Vue双向绑定原理及其实现
在之前面试的时候被面试官问到是否了解Vue双向绑定的原理,其实自己之前看过双向绑定的原理,但也就是粗略的了解,但是没有深入.面试官当时让我手写一个原理,但是就蒙了
- 172. 阶乘后的零 Java解法
https://leetcode-cn.com/problems/factorial-trailing-zeroes/ 172. 阶乘后的零 这题要完成其实要知道一个很巧妙的思想,就是阶乘里面,后面的 ...
- Java中Random随机数
java中一般有两种随机数,一个是Math中random()方法,一个是Random类. 一.Math.random() 随即生成0<=x<1的小数. 实例:如何写,生成随机生成出0~10 ...
- [解决方案]IIS配置后报错404,500,502等系列问题
很多时候刚部署完服务器的IIS以后,第一次部署站点都会出现形形色色,各种各样的报错问题,但这些问题大同小异,我这里就给大家提供的解决的方案,以达到以不变应万变的效果 目的:让大家学会处理类似问题的方法 ...
- 【部分转载】:【lower_bound、upperbound讲解、二分查找、最长上升子序列(LIS)、最长下降子序列模版】
二分 lower_bound lower_bound()在一个区间内进行二分查找,返回第一个大于等于目标值的位置(地址) upper_bound upper_bound()与lower_bound() ...
- 现代c++与模板元编程
最近在重温<c++程序设计新思维>这本经典著作,感慨颇多.由于成书较早,书中很多元编程的例子使用c++98实现的.而如今c++20即将带着concept,Ranges等新特性一同到来,不得 ...
- 基于TP5.1实用案例及教程
推荐<基于TP5.1实用案例及教程>书 目录: 通用封装 Export通用封装Import通用封装配合Import通用封装的ImportBaseVerify类Files通用封装Direct ...
- ZK安装、ZK配置、ZK集群部署
今天心血来潮,想搞一下zookeeper集群.具体步骤记录下吧~嘻嘻
- Unity基础之:UnityAPI的学习
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...