codeforces1009G Allowed Letters【贪心+hall定理】
因为是字典序所以贪心选当前能选的最小的,所以问题就在于怎么快速计算当前这个位置能不能选枚举的字母
重排之后的序列是可以和原序列完美匹配的,而完美匹配需要满足hall定理,也就是左边任意k个集合一定和右边至少k个点相连
又一共6个字符,原序列中相同字符点连出的点集是一样的,所以只要2^6个字符集合满足hall定理,每次这样枚举状压判断一下即可
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=100005;
int n,m,sm[N],f[N][70],ok[N];
char s[N],c[10],flg,ans[N];
int main()
{
	scanf("%s%d",s+1,&m);
	n=strlen(s+1);
	for(int i=1;i<=n;i++)
		for(int j=0;j<(1<<6);j++)
			if(j&(1<<(s[i]-'a')))
				sm[j]++;
	for(int i=1;i<=n;i++)
		ok[i]=(1<<6)-1;
	for(int i=1,x;i<=m;i++)
	{
		scanf("%d%s",&x,c+1);
		ok[x]=0;
		for(int j=1;j<=strlen(c+1);j++)
			ok[x]+=(1<<(c[j]-'a'));
	}
	for(int i=n;i>=1;i--)
		for(int j=0;j<(1<<6);j++)
			f[i][j]=f[i+1][j]+(((j&ok[i])==ok[i])?1:0);
	for(int i=1;i<=n;i++)
	{
		bool fl=0;
		for(int j=0;j<6&&!fl;j++)
			if(sm[1<<j]&&(ok[i]&(1<<j)))
			{
				flg=1;
				for(int k=0;k<(1<<6)&&flg;k++)
					if(f[i+1][k]>sm[k]-((k>>j)&1))
						flg=0;
				if(flg)
				{
					fl=1;
					ans[i]='a'+j;
					for(int k=0;k<(1<<6);k++)
						if(k&(1<<j))
							sm[k]--;
				}
			}
		if(!flg)
		{
			puts("Impossible");
			return 0;
		}
	}
	for(int i=1;i<=n;i++)
		printf("%c",ans[i]);
	return 0;
}
codeforces1009G Allowed Letters【贪心+hall定理】的更多相关文章
- [CF1009G]Allowed Letters[贪心+霍尔定理]
		题意 给你一个长为 \(n\) 的串,字符集为 \(a,b,c,d,e,f\) .你可以将整个串打乱之后重新放置,但是某些位置上有一些限制:必须放某个字符集的字符.问字典序最小的串,如果无解输出 &q ... 
- CF R638 div2 F Phoenix and Memory 贪心 线段树 构造 Hall定理
		LINK:Phoenix and Memory 这场比赛标题好评 都是以凤凰这个单词开头的 有凤来仪吧. 其实和Hall定理关系不大. 不过这个定理有的时候会由于 先简述一下. 对于一张二分图 左边集 ... 
- Codeforces 1009G Allowed Letters  最大流转最小割 sosdp
		Allowed Letters 最直观的想法是贪心取, 然后网络流取check可不可行, 然后T了. 想到最大流可以等于最小割, 那么我们状压枚举字符代表的6个点连向汇点是否断掉, 然后再枚举64个本 ... 
- TCO 2015 1A Hard.Revmatching(Hall定理)
		\(Description\) 给定一个\(n\)个点的二分图,每条边有边权.求一个边权最小的边集,使得删除该边集后不存在完备匹配. \(n\leq20\). \(Solution\) 设点集为\(S ... 
- BZOJ1135:[POI2009]Lyz(线段树,Hall定理)
		Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负,则代表走了这么多人 ... 
- Card Collector AtCoder - 5168(二分图匹配的HALL定理)
		题意: 给定一个H行W列的矩阵,在矩阵的格点上放带权值的卡片(一个点上能放多张). 现在从每行每列各拿走一张卡片(没有可以不拿),求可以拿到的最大权值. 卡片数N<=1e5,H,W<=1e ... 
- Hall定理 二分图完美匹配
		充分性证明就先咕了,因为楼主太弱了,有一部分没看懂 霍尔定理内容 二分图G中的两部分顶点组成的集合分别为X, Y(假设有\(\lvert X \rvert \leq \lvert Y \rvert\) ... 
- 【CF981F】Round Marriage(二分答案,二分图匹配,Hall定理)
		[CF981F]Round Marriage(二分答案,二分图匹配,Hall定理) 题面 CF 洛谷 题解 很明显需要二分. 二分之后考虑如果判定是否存在完备匹配,考虑\(Hall\)定理. 那么如果 ... 
- bzoj3693: 圆桌会议 二分图 hall定理
		目录 题目链接 题解 代码 题目链接 bzoj3693: 圆桌会议 题解 对与每个人构建二分,问题化为时候有一个匹配取了所有的人 Hall定理--对于任意的二分图G,G的两个部分为X={x1,x2,- ... 
随机推荐
- php分10个不同等级压缩优化图片(PNG)
			今天找到一个php写的压缩图片程序,可以分10个等级(0-9)来压缩,0等级时压缩比率不是很大,图片不会失真:随着压缩等级不断增大,图片会变得越来越不清晰,通常压缩后图片大小可以减少到原来的50%,压 ... 
- Java for LeetCode 111 Minimum Depth of Binary Tree
			Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ... 
- 关于android R.java文件无法创建的问题
			R.java文件无法创建的原因网上有很多说法普遍是以下两种: 1. xml文件有错误: 解决方法就是找到哪个xml有错然后把错误修复就OK了. 2.编码问题 这时候只要把xml文件的编码改成utf8就 ... 
- HDU - 1495 非常可乐  【BFS】
			题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1495 思路 首先 如果可乐的体积 是奇数 那么是无解的 然后 如果能够得到两杯 都是一般容量的可乐 那 ... 
- 4.2 《锋利的jQuery》jQuery中的动画
			问题:queue()方法? tip0: jquery从1.9版本以上就不支持toggle()方法. // $("#panel h5.head").toggle(function() ... 
- git显示颜色配置
			启用默认的颜色设置可以使用如下命令 git config --global color.ui true 如果不喜欢花花绿绿的颜色,可以将其关闭: git config --global color.u ... 
- Linux 下使用C语言 gets()函数报错
			在Linux下,使用 gets(cmd) 函数报错:warning: the 'gets' function is dangerous and should not be used. 解决办法:采用 ... 
- SDUT 2133 数据结构实验之栈三:后缀式求值
			数据结构实验之栈三:后缀式求值 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的后缀表示式(基本操作数都是 ... 
- hihocoder 在线测试 补提交卡 (Google)
			题目1 : 补提交卡 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序.100天过去 ... 
- zabbix api支持的数据类型
			bool flag integer float string timestamp array object query countOutput editable excludeSearch filte ... 
