题意:

  给出一个字符串 给出几个定点必须是哪个字母(或者是几个字母中的一个)  然后求在满足所有定点后的最小字符串

解析:

  没错 这题是暴力 用状压暴力

   “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(状压思维)的更多相关文章

  1. CodeForces 11D(状压DP 求图中环的个数)

    Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no re ...

  2. UVA 10318 Security Panel(DFS剪枝 + 状压 + 思维)题解

    题意:给一个r*c的矩阵开关(初始全打开的),每次按下一个开关都会改变3*3范围内的有*的地方的状态,问你最少几步能让开关全闭上,按升序输出按哪些按钮 思路:每个按钮至多按一下,按按钮的顺序和结果无关 ...

  3. Vladik and cards CodeForces - 743E (状压)

    大意: 给定序列, 求选出一个最长的子序列, 使得任选两个[1,8]的数字, 在子序列中的出现次数差不超过1, 且子序列中相同数字连续. 正解是状压dp, 先二分转为判断[1,8]出现次数>=x ...

  4. Clear The Matrix CodeForces - 903F (状压)

    大意: 给定4行的棋盘以及4种大小的正方形方块, 每种各有一定花费, 每次可以选一种方块放在棋盘上, 棋盘对应格子全变为'.', 求最少花费使得棋盘全部变成'.' 状压基本操作练习, 状态取12位, ...

  5. Pollywog CodeForces - 917C (状压)

    链接 大意: 一共n个格子, 初始$x$只蝌蚪在前$x$个格子, 每次最左侧的蝌蚪向前跳, 跳跃距离在范围[1,k], 并且每只蝌蚪跳跃都有一定花费, 有$q$个格子上有石头, 若有蝌蚪跳到某块石头上 ...

  6. Codeforces 678E 状压DP

    题意:有n位选手,已知n位选手之间两两获胜的概率,问主角(第一个选手)最终站在擂台上的概率是多少? 思路:一看数据范围肯定是状压DP,不过虽然是概率DP,但是需要倒着推:我们如果正着推式子的话,初始状 ...

  7. Codeforces 8C 状压DP

    题意:有个人想收拾行李,而n个物品散落在房间的各个角落里(n < 24).现在给你旅行箱的坐标(人初始在旅行箱处),以及n个物品的坐标,你一次只能拿最多两个物品,并且拿了物品就必须放回旅行箱,不 ...

  8. Keyboard Purchase CodeForces - 1238E (状压)

    大意: 给定串$s$, 字符集为字母表前$m$个字符, 求一个$m$排列$pos$, 使得$\sum\limits_{i=2}^n|{pos}_{s_{i-1}}-{pos}_{s_{i}}|$最小. ...

  9. Codeforces 1215E 状压DP

    题意:给你一个序列,你可以交换序列中的相邻的两个元素,问最少需要交换多少次可以让这个序列变成若干个极大的颜色相同的子段. 思路:由于题目中的颜色种类很少,考虑状压DP.设dp[mask]为把mask为 ...

随机推荐

  1. day 21 今日学习内容

    今日没有学习新的内容,可能今天就是对于前一段时间学习的总结,今天做了一个相对之前作业更加完善的ATM+购物车,在今天的学习里,我对于编程有了新的见解,编程并非一味的for..if...for...更多 ...

  2. excel的宏与VBA入门(二)——数据类型与变量

    一.属性与方法 1.属性 上面单击对象,下面即显示对应的属性: 2.方法 双击左上的对象,即可看到相应的方法: 二.数据类型 到 Boolean True 或 False , 到 , ,,, 到 ,, ...

  3. go语言之行--包与变量

    一.包的概念 包是go语言中不可缺少部分,在每个go源码的第一行进行定义,定义方式是:package "包名",并且该名称是作为调用该包时候所使用的名称. 包的概念总结: 每个 G ...

  4. 20155229《网络对抗技术》Exp5:MSF基础应用

    实验内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 一个主动攻击实践,如ms08-067; 一个针对浏览器的攻击,如ms11-050: 一个针对 ...

  5. flask+socketio+echarts3 服务器监控程序(基于后端数据推送)

    本文地址:http://www.cnblogs.com/hhh5460/p/7397006.html 说明 以前的那个例子的思路是后端监控数据存入数据库:前端ajax定时查询数据库. 这几天在看web ...

  6. apache目录别名

    #默认家目录DocumentRoot "/var/www/html"<Directory "/var/www"> AllowOverride Non ...

  7. linux下的yum命令详细介绍

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  8. .Net单元测试业务实践

    使用次数和允许取消次数单元测试实践 /** * prism.js Github theme based on GitHub's theme. * @author Sam Clarke */ code[ ...

  9. 《Effective Java》 学习笔记 —— 并发

    <Effective Java>第二版学习笔记之并发编程. 第66条 同步访问共享的可变数据 * 关键字synchronized可以保证在同一时刻只有一个线程可以执行某个方法或代码块. * ...

  10. 关于web.xml3.0启动报错

    九月 08, 2017 10:18:19 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin 警告: [SetPropertiesRu ...