题意:

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

解析:

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

   “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. DRUPAL7 : 安装中文版本时遇到的问题

    http://yeenav.com是基于Drupal 7+汉化资源 搭建. 期间遇到一些麻烦, 做个记录. 首先把语言包drupal-7.0.zh-hans.po 放在htdocs/drupal-7. ...

  2. stm32中assert_param的用法说明

    stm32中assert_param的用法说明   首先是要知道条件判断语句 这个运算符分成三部分: (条件) ? (条件成立执行部分) :(条件不成立执行部分) 就这么简单 例如:a=(x>y ...

  3. Java IO详解(三)------字节输入输出流

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

  4. 文理分科 BZOJ3894 & happiness BZOJ2127

    分析: 最小割(一开始我没看出来...后来经过提点,大致理解...),不选则割的思想. 我们先这样考虑,将和选理相关的和S相连,与选文相关的和T相连,如果没有第二问,那么建图就是简单的S连cnt,cn ...

  5. 20155304《网络对抗》Exp7 网络欺诈技术防范

    20155304<网络对抗>Exp7 网络欺诈技术防范 实践内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 (1)简单应用SET工具建立冒名网 ...

  6. 20155306 白皎 0day漏洞——漏洞利用原理之栈溢出利用

    20155306 白皎 0day漏洞--漏洞利用原理之栈溢出利用 一.系统栈的工作原理 1.1内存的用途 根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行.但是不管什么样的操作系统.什么样 ...

  7. 浅谈Objeact.clone克隆(纯个人理解,如有错误请指正)

    现在先来看一下jdk给出的Object.clone源码和注释 /** * Creates and returns a copy of this object. The precise meaning ...

  8. TMS320VC5509驱动AT24C02

    1. 刚开始的波形不太对,比如如下代码 i2c_status = I2C_write( at24c02_write_buf, //pointer to data array , //length of ...

  9. libgdx学习记录13——矩形CD进度条绘制

    利用ShapeRenderer可进行矩形进度条的绘制,多变形的填充等操作. 这是根据角度获取矩形坐标的函数. public Vector2 GetPoint( float x, float y, fl ...

  10. CS100.1x Introduction to Big Data with Apache Spark

    CS100.1x简介 这门课主要讲数据科学,也就是data science以及怎么用Apache Spark去分析大数据. Course Software Setup 这门课主要介绍如何编写和调试Py ...