CF1009G Allowed Letters
题意:
给你一个长为n的串,字符集'a'~'f'。你可以重排这个串,满足指定m个位置上只能放特定的字符,m个位置以及字符集会给出。求字典序最小的串?
$n,m\leq 10^5.$
题解:
稍微需要那么一点技巧的贪心。
贪心策略比较显然,无非就是从左往右放尽可能小的字符,同时保证当前位置之后有合法解。
考虑预处理a[i]:i位置可以放的字符集;cnt[i]:集合i的字符在整个串中出现的次数;b[i][j]:i~n位置中a[]被集合j包含的个数。每次判断一个字符是否可行,只要枚举任意一个集合j,如果j集合中所有可用的字符在之后每个放一个位置还不够的话,说明不合法。
依次贪心下去即可。
复杂度$\mathcal{O}(6\times 2^6\times n)$。
code:
#include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x);i<=(y);i++)
#define per(i,x,y) for (int i=(x);i>=(y);i--)
#define ll long long
#define inf 1000000001
#define y1 y1___
using namespace std;
ll read(){
char ch=getchar();ll x=;int op=;
for (;!isdigit(ch);ch=getchar()) if (ch=='-') op=-;
for (;isdigit(ch);ch=getchar()) x=(x<<)+(x<<)+ch-'';
return x*op;
}
#define N 100005
#define M 70
int n,m,a[N],b[N][M],tmp[M],cnt[M];char s[N],s2[N],ans[N];
int main(){
scanf("%s",s+);n=strlen(s+);
m=read();
while (m--){
int k=read(),l;scanf("%s",s2+);l=strlen(s2+);
rep (i,,l) a[k]|=<<s2[i]-'a';//该位置可以放的字符集
}
rep (i,,n) if (!a[i]) a[i]=(<<)-;
rep (i,,n){
int x=s[i]-'a';
rep (j,,(<<)-) if (j>>x&) cnt[j]++;//cnt[i]:集合i的字符在整个串中出现的次数
}
per (i,n,) rep (j,,(<<)-){//b[i][j]:i~n位置中a[]被集合j包含的个数
if ((j&a[i])==a[i]) tmp[j]++;
b[i][j]=tmp[j];
}
rep (p,,n-){
bool flag=;
rep (i,,) if (cnt[<<i]&&(a[p]>>i&)){//贪心,保证之后还能放
bool chk=;
rep (j,,(<<)-) if (cnt[j]-(j>>i&)<b[p+][j]){//j集合中每个字符放一个位置还不够,不合法
chk=;
break;
}
if (chk){
flag=;ans[p]=i+'a';
rep (j,,(<<)-) if (j>>i&) cnt[j]--;
}
}
if (!flag){puts("Impossible");exit();}
}
bool flag=;
rep (i,,) if (cnt[<<i]&&(a[n]>>i&)){
flag=;ans[n]=i+'a';
break;
}
if (!flag){puts("Impossible");exit();}
ans[n+]='\0';
puts(ans+);
return ;
}
CF1009G Allowed Letters的更多相关文章
- [CF1009G]Allowed Letters[贪心+霍尔定理]
题意 给你一个长为 \(n\) 的串,字符集为 \(a,b,c,d,e,f\) .你可以将整个串打乱之后重新放置,但是某些位置上有一些限制:必须放某个字符集的字符.问字典序最小的串,如果无解输出 &q ...
- 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“ 这几个数字代 ...
- Educational Codeforces Round 47 (Rated for Div. 2)G. Allowed Letters 网络流
题意:给你一个字符串,和每个位置可能的字符(没有就可以放任意字符)要求一个排列使得每个位置的字符在可能的字符中,求字典序最小的那个 题解:很容易判断有没有解,建6个点表示从a-f,和源点连边,容量为原 ...
- 【Cf Edu #47 G】Allowed Letters
这个题大概就是每一个位置都有一个能填字符的限制(一个点集),给出已有的$n$个字符,问能填出的最小字典序的字符串. 总体思路是贪心,每一位尽量选最小的字符. 关键在于判断在某位选了一个字符后,接下来的 ...
- codeforces1009G Allowed Letters【贪心+hall定理】
因为是字典序所以贪心选当前能选的最小的,所以问题就在于怎么快速计算当前这个位置能不能选枚举的字母 重排之后的序列是可以和原序列完美匹配的,而完美匹配需要满足hall定理,也就是左边任意k个集合一定和右 ...
- Educational Codeforces Round 47 (Rated for Div. 2) G. Allowed Letters
把原字符看成 $X$,每个位置看成 $Y$,每种字符向每个能去的位置连边,就成了一个二分图完美匹配的问题.现要得到字典序最小,那么就枚举每一位要放什么,然后看放完这种字符,剩下的字符的个数和后面能不能 ...
- 一句话题解&&总结
CF79D Password: 差分.两点取反,本质是匹配!最短路+状压DP 取反是套路,匹配是发现可以把操作进行目的化和阶段化,从而第二次转化问题. 且匹配不会影响别的位置答案 sequence 计 ...
随机推荐
- cmd 使用gii的命令行用法
1.生成模型 php yii gii/model --ns=common\models --tableName=contract_supplemental --modelClass=ContractS ...
- 从ZoomEye API 到 Weblogic 弱口令扫描
参考资料: ZoomEye API: https://www.zoomeye.org/api/doc Weblogic-Weakpassword-Scnner: https://github.com/ ...
- 可怕的npm蠕虫
https://hackernoon.com/im-harvesting-credit-card-numbers-and-passwords-from-your-site-here-s-how-9a8 ...
- Mysql储存过程3:if语句
--if/else语句 if 条件 then SQL语句 else SQL语句elseifSQL语句 end if; create procedure test1( number int ) begi ...
- Python3 断言
#!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:CarsonLi ''' 断言一般用于后面有非常重要的操作,需要使用前面的数据,而且不容许出 ...
- UVA题解三
UVA题解三 UVA 127 题目描述:\(52\)张扑克牌排成一列,如果一张牌的花色或者数字与左边第一列的最上面的牌相同,则将这张牌移到左边第一列的最上面,如果一张牌的花色或者数字与左边第三列的最上 ...
- hive中行转换成列以及hive相关知识
Hive语句: Join应该把大表放到最后 左连接时,左表中出现的JOIN字段都保留,右表没有连接上的都为空.对于带WHERE条件的JOIN语句,例如: 1 SELECT a.val, b.val F ...
- POJ - 1251
Jungle Roads Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20024 Accepted: 9234 Des ...
- TeX Live & TeXstudio 安装手记
数据库课上又看到了那位用 beamer 做 slides 的师兄,想到自己一拖再拖的LaTeX入门,决定赶快动手装个环境再说~在经过一番搜索和研究之后决定先在 windows 底下试用,选择 TeX ...
- PhpStorm设置函数注释模板
*设置位置:"Settings"->"file templates"; 如下图,设置头部注释.类注释以及函数注释,时间.用户名.文件名称等随机改变的属性, ...