题目链接:Codeforces 482C Game with Strings

题目大意:给定N个字符串,如今从中选定一个字符串为答案串,你不知道答案串是哪个。可是能够通过询问来确定,

每次询问一个位置上字符为多少。

如今你询问的每一个位置的概率是同样的,(问过的位置不会再问)。求询问次数的期

望。

解题思路:由于字符串长度不会大于20。所以用二进制表示询问了哪些位置。C[s]即为询问s的位置能够确定多少个字

符串。

这步不能通过枚举s,然后推断处理,复杂度为o(2^20 * 20 * 50),太高。

能够通过枚举两个字符串,推断它们哪些

位置同样,则在相应的s状态下标记这两个字符串无法被区分,最后在遍历一遍s状态递推一次,由于假设s1状态包括s2

状态。那么s2状态下不能区分的字符串相同在s1状态无法区分。

确定每一个状态下可区分字符串的个数之后就好做了,dp[s]表示移动到状态s后还要继续推断的概率,不用继续推断的直

接加到相应的步数中。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm> using namespace std;
typedef long long ll;
typedef pair<ll, int> pii;
const int maxs = (1<<20) + 5;
const int maxn = 55;
const int maxm = 25;
const ll x = 123; int N, L, T, C[maxs];
ll D[maxs];
char str[maxn][maxm]; inline int idx(char ch) {
if (ch >= 'a' && ch <= 'z')
return ch - 'a';
return ch - 'A' + 26;
} inline int bitcount(ll x) {
return x == 0 ? 0 : bitcount(x>>1) + (x&1);
} void init () {
scanf("%d", &N);
for (int i = 0; i < N; i++)
scanf("%s", str[i]);
L = strlen(str[0]);
T = (1<<L); for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
int s = 0;
for (int k = 0; k < L; k++)
s |= (str[i][k] == str[j][k]) << k;
D[s] |= (1LL<<i) | (1LL<<j);
}
} for (int i = T-1; i; i--) {
for (int j = 0; j < L; j++)
if (i&(1<<j))
D[i^(1<<j)] |= D[i];
C[i] = N - bitcount(D[i]);
}
} double dp[maxs], p[100]; int main () {
init(); if (N == 1) {
printf("%.9lf\n", 0.0);
return 0;
} dp[0] = 1;
for (int u = 0; u < T; u++) {
int bit = bitcount(u), sum = N - C[u];
double mv = dp[u] / (L - bit);
if (N == C[u]) continue; for (int i = 0; i < L; i++) {
if (u&(1<<i))
continue;
int s = u | (1<<i);
double a = 1.0 * (C[s] - C[u]) / sum; dp[s] += mv * (1 - a);
p[bit+1] += mv * a;
}
} /*
double sum = 0;
for (int u = 1; u <= L; u++) {
printf("%lf\n", p[u]);
sum += p[u];
}
printf("%lf!\n", sum);
*/ double ans = 0;
for (int i = 1; i <= L; i++)
ans += p[i] * i;
printf("%.9lf\n", ans);
return 0;
}

Codeforces 482C Game with Strings(dp+概率)的更多相关文章

  1. CodeForces 482C Game with Strings

    意甲冠军: n一定长度m串  隐藏的字符串相等的概率  然后,你猜怎么着玩家隐藏的字符串  的询问字符串的一个位置  再不断的知道一些位置后  游戏者就能够确定藏起来的串是什么  问  游戏者的期望步 ...

  2. Codeforces 360C Levko and Strings dp

    题目链接:点击打开链接 题意: 给定长度为n的字符串s,常数k 显然s的子串一共同拥有 n(n-1)/2 个 要求找到一个长度为n的字符串t,使得t相应位置的k个子串字典序>s #include ...

  3. codeforces 696B B. Puzzles(树形dp+概率)

    题目链接: B. Puzzles time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  4. UVA 11427 Expect the Expected(DP+概率)

    链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35396 [思路] DP+概率 见白书. [代码] #include&l ...

  5. tyvj P1864 [Poetize I]守卫者的挑战(DP+概率)

    P1864 [Poetize I]守卫者的挑战 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜 ...

  6. Codeforces 385B Bear and Strings

    题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...

  7. [LnOI2019]加特林轮盘赌(DP,概率期望)

    [LnOI2019]加特林轮盘赌(DP,概率期望) 题目链接 题解: 首先特判掉\(p=0/1\)的情况... 先考虑如果\(k=1\)怎么做到\(n^2\)的时间复杂度 设\(f[i]\)表示有\( ...

  8. [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)

    [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...

  9. Codeforces Round #358 (Div. 2) D. Alyona and Strings dp

    D. Alyona and Strings 题目连接: http://www.codeforces.com/contest/682/problem/D Description After return ...

随机推荐

  1. event & EventHandler

    [event & EventHandler] 在老C#中EventHandler指的是一个需要定义一个delegate,这个delegate是回调的规范.例如: public delegate ...

  2. Linux Centos7安装chrome浏览器

    参考:https://blog.csdn.net/u010472499/article/details/72327963 1. 配置yum源 在目录 /etc/yum.repos.d/ 下新建文件 g ...

  3. hdu 1158-Employment Planning,n*n*n

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1158 解题思路就不多说,动态规划. 值得提及的是题目没有给出数据范围,水过的都默认工人数目不超过100 ...

  4. FrameWork中SQLServer数据源使用宏函数出错解决办法

    环境:DW是SQLServer2008 建模工具:Cognos FrameWork Version:Cognos10.2 出现问题:在FM中创建查询主题,sql类型数据源,引入宏函数#CAMIDLis ...

  5. share_ptr

    1.为了保证不会重复释放内存,auto_ptr的copy构造和copy赋值都是破坏性操作,执行后,导致右操作数的指针为0.这就出现了,copy构造或者copy赋值后,两个对象不相等了. 2.auto_ ...

  6. CAD设置图层透明显示

    在生产制图过程中,图层有利于更好的地理信息的分类,但显示就有些问题了,比如多个面层重叠.通常为了显示多个面重叠区域的特征,我们通常的做法是设置图层填充(符号填充,如地籍处理中经常这样做),或者设置图层 ...

  7. UML 之 用例图

    用例图是指由参与者(Actor).用例(Use Case)以及它们之间的关系构成的用于描述系统功能的静态视图.用例图(User Case)是被称为参与者的外部用户所能观察到的系统功能的模型图,呈现了一 ...

  8. ibatis自定义数据类型在不支持中文的数据库存储汉字

    道理很简单,把gbk的汉字转换成iso编码存进数据库就可以了,读出来的时候把iso转换成gbk还原出原始的汉字. ibatis可以自定义类型处理器,在这里面做编码转换再适合不过了! sqlmap-co ...

  9. UNIX网络编程读书笔记:简介

    认知套接口编程接口 理解原始套接口(raw socket)的概念   值得注意的是,客户和服务器是典型的用户进程,而TCP和IP协议则通常是系统内核协议栈的一部分. 上图中在TCP和UDP之间留有间隙 ...

  10. Python 换行符

    raw字符串与多行字符串如果一个字符串包含很多需要转义的字符,对每一个字符都进行转义会很麻烦.为了避免这种情况,我们可以在字符串前面加个前缀 r ,表示这是一个 raw 字符串,里面的字符就不需要转义 ...