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 计 ...
随机推荐
- img图片居中
关键词:clear: both; display: block; margin:auto; 图片居左,居右,居中: /* Alignment */ .alignleft { display ...
- 七牛云 PHP SDK服务器鉴权失败!参数解释
昨天搞了一下午,用7牛官方的SDK demo 1.上传凭证 $policy = array( 'callbackUrl' => 'http://api.example.com/qiniu/upl ...
- CodeForces - 1003D
Polycarp has nn coins, the value of the ii-th coin is aiai. It is guaranteed that all the values are ...
- Verilog笔记.2.数字逻辑电路
1.数字逻辑电路的种类:1) 组合逻辑:输出只是当前输入逻辑电平的函数(有延时),与电路的原始状态无关的逻辑电路.也就是说,当输入信号中的任何一个发生变化时,输出都有可能会根据其变化而变化,但与电路目 ...
- Verilog笔记.1.基本语法
0.前 抽象模型分级: • 系统级(system):用高级语言结构实现设计模块的外部性能的模型.• 算法级(algorithm):用高级语言结构实现设计算法的模型.• RTL级(Register Tr ...
- npm install ERR! code E400/E404
在安装webpack的过程中,出现了一个报错npm install ERR! code E400/E404 解决方法: 1.查看npm配置文件 是否有错误: 执行 npm config edit 查看 ...
- NEO发行资产Token
NEO注册发行全局资产(Token 和 Share)功能已经在neo-gui里面集成,发行非常方便, 高级-注册资产 注册Token消耗GAS感人 4990 Gas 点击调用,获取交易ID为资产ID ...
- Mysql储存过程1: 设置结束符与储存过程创建
#显示储存过程 show procedure status; #设置结束符 delimiter $; #创建储存过程 create procedure procedure_name() begin - ...
- Power Profiles for Android
http://source.android.com/devices/tech/power.html Battery usage information is derived from battery ...
- 关于Java代码优化的35条建议
代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是, ...