Allowed Letters CodeForces - 1009G(状压思维)
题意:
给出一个字符串 给出几个定点必须是哪个字母(或者是几个字母中的一个) 然后求在满足所有定点后的最小字符串
解析:
没错 这题是暴力 用状压暴力
“a - f” 用”0 - 5“ 这几个数字代替 输入字符串 num[i]为字母i的个数,然后输入定点必须为哪个字母,ti[i]中用六位二进制来存储当前位置i的可以放的字母
1代表放 0不放
设cnt = 1<<6 - 1; 即为所有状态的上界
然后从后向前遍历一遍,统计对于位置i到n 状态k还需要多少个 sum[i][j]来表示
然后暴力就好了。。就是从前向后遍历每一个位置,对于位置i 我们遍历所有字母挨个试,又对于每一个字母,统计一下在这个位置放了这个字母后,我们去检查是否还能满足后边的所有状态(挨个状态遍历一遍求出当前状态所需要的字母总和判断一下) 如果可以 则下一个位置 不可以下一个试字母 如果所有字母都不符合 那就impossible
#include <bits/stdc++.h>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn = , INF = 0x7fffffff, cnt = (<<) - ;
char str[maxn];
int num[], ti[maxn*], sum[maxn][cnt+], zt[cnt+];
int m;
vector<char> v; int main()
{
cin>> str;
int n, len;
n = len = strlen(str);
for(int i=; i<len; i++)
num[str[i]-'a']++; //统计每个字母的数量
cin>> m;
int id;
for(int i=; i<m; i++)
{
cin>> id >> str;
len = strlen(str);
for(int j=; j<len; j++)
{
ti[id-] |= (<<(str[j] - 'a')); //统计能放在位置id-1 的字母集合
}
}
for(int i=; i<n; i++)
if(!ti[i]) ti[i] = cnt; //如果为0 说明没有被指定 所以都可以放
for(int i=n-; i>=; i--) //从后向前遍历一遍,统计对于位置i到n 状态k还需要多少个
{
for(int j=; j<=cnt; j++) //对当前i 遍历所有状态
{
if((ti[i] & j) == ti[i]) //子集
zt[j]++;
sum[i][j] = zt[j];
}
}
int _sum = ;
for(int i=; i<n; i++) //遍历每个位置 暴力判断即可
{
int flag1 = ;
for(int j=; j<; j++)
{
int flag2 = ;
if(!num[j] || (ti[i]&(<<j)) == ) continue;
num[j]--;
for(int k=; k<=cnt; k++)
{
_sum = ;
for(int r=; r<; r++)
if(k & (<<r))
_sum += num[r];
if(_sum < sum[i+][k])
{
flag2 = ; break;
}
}
if(flag2)
{
flag1 = ; v.push_back('a'+j); break;
}
num[j]++;
}
if(!flag1)
return puts("Impossible"), ;
}
for(int i=; i<v.size(); i++)
{
printf("%c", v[i]);
}
cout<<endl; return ;
}
Allowed Letters CodeForces - 1009G(状压思维)的更多相关文章
- CodeForces 11D(状压DP 求图中环的个数)
Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no re ...
- UVA 10318 Security Panel(DFS剪枝 + 状压 + 思维)题解
题意:给一个r*c的矩阵开关(初始全打开的),每次按下一个开关都会改变3*3范围内的有*的地方的状态,问你最少几步能让开关全闭上,按升序输出按哪些按钮 思路:每个按钮至多按一下,按按钮的顺序和结果无关 ...
- Vladik and cards CodeForces - 743E (状压)
大意: 给定序列, 求选出一个最长的子序列, 使得任选两个[1,8]的数字, 在子序列中的出现次数差不超过1, 且子序列中相同数字连续. 正解是状压dp, 先二分转为判断[1,8]出现次数>=x ...
- Clear The Matrix CodeForces - 903F (状压)
大意: 给定4行的棋盘以及4种大小的正方形方块, 每种各有一定花费, 每次可以选一种方块放在棋盘上, 棋盘对应格子全变为'.', 求最少花费使得棋盘全部变成'.' 状压基本操作练习, 状态取12位, ...
- Pollywog CodeForces - 917C (状压)
链接 大意: 一共n个格子, 初始$x$只蝌蚪在前$x$个格子, 每次最左侧的蝌蚪向前跳, 跳跃距离在范围[1,k], 并且每只蝌蚪跳跃都有一定花费, 有$q$个格子上有石头, 若有蝌蚪跳到某块石头上 ...
- Codeforces 678E 状压DP
题意:有n位选手,已知n位选手之间两两获胜的概率,问主角(第一个选手)最终站在擂台上的概率是多少? 思路:一看数据范围肯定是状压DP,不过虽然是概率DP,但是需要倒着推:我们如果正着推式子的话,初始状 ...
- Codeforces 8C 状压DP
题意:有个人想收拾行李,而n个物品散落在房间的各个角落里(n < 24).现在给你旅行箱的坐标(人初始在旅行箱处),以及n个物品的坐标,你一次只能拿最多两个物品,并且拿了物品就必须放回旅行箱,不 ...
- Keyboard Purchase CodeForces - 1238E (状压)
大意: 给定串$s$, 字符集为字母表前$m$个字符, 求一个$m$排列$pos$, 使得$\sum\limits_{i=2}^n|{pos}_{s_{i-1}}-{pos}_{s_{i}}|$最小. ...
- Codeforces 1215E 状压DP
题意:给你一个序列,你可以交换序列中的相邻的两个元素,问最少需要交换多少次可以让这个序列变成若干个极大的颜色相同的子段. 思路:由于题目中的颜色种类很少,考虑状压DP.设dp[mask]为把mask为 ...
随机推荐
- Android百度地图2.0运行定位到当前位置时“服务没有启动”
现象:运行mapView.requestLocation(),返回值为1即“服务没有启动”. 解决方案:看一下主配置文件中服务是否配置了,具体如下: <service android:name= ...
- excel实用技巧——vlookup函数
1.VLOOKUP函数的套路 VLOOKUP(要找谁,在哪儿找,返回第几列的内容,精确找还是近似找) 最后一个参数: 如果为0或FASLE,用精确匹配方式,而且支持无序查找: 如果为TRUE或被省略, ...
- 大数据入门第十四天——Hbase详解(三)hbase基本原理与MR操作Hbase
一.基本原理 1.hbase的位置 上图描述了Hadoop 2.0生态系统中的各层结构.其中HBase位于结构化存储层,HDFS为HBase提供了高可靠性的底层存储支持, MapReduce为HBas ...
- linux下使用软连接之案例二
在笔者的上一篇文章介绍过怎么通过linux的软连接在不修改上传代码的情况下,将上传到项目路径下的图片改为上传到项目外面,防止重新部署后图片被删除了.同时还可以直接通过类似访问静态资源的方 ...
- ES6 箭头函数易出错细节
箭头函数表达式的语法比函数表达式更短,并且没有自己的this,arguments,super或 new.target. 箭头函数基本语法 (参数1, 参数2, -, 参数N) => { 函数声明 ...
- Solr 后台查询实例 (工作备查)
有时间再进行整理package xxx.service.impl; import java.util.HashMap; import java.util.Map; import java.util.M ...
- 蓝牙学习笔记二(Android连接问题)
可以通过以下两点加速蓝牙连接: 1.更新连接参数 interval:连接间隔(connection intervals ),范围在 7.5 毫秒 到 4 秒. latency:连接延迟 ... 还有一 ...
- Jq_select的操作
jQuery获取Select选择的Text和Value: 语法解释: $("#select_id").change(function(){//code...}); //为Selec ...
- 浅谈我的UI设计之路
时光匆匆,进入UI学习已经快两个月了,这段时间过得很充实,因为有压力才有收获. 还记的刚刚学习手绘的时候,对于这个行业只有一个初步的认识,知道自己喜欢,但是真正学习的时候才发现,我要学习的东西还有很多 ...
- 网易云易盾朱星星:最容易被驳回的10大APP过检项
本文由 网易云发布. 1月20日,“走进网易:移动测试与安全实践”公开活动在杭州西湖区颐高创业大厦4F楼友会创业咖啡厅举行.本次活动的议题聚焦在如何实现应用的高效开发.安全过检.开发功耗降到最低等热 ...