题目链接: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. Thinkphp学习笔记7-输入变量

    在Web开发过程中,我们经常需要获取系统变量或者用户提交的数据,这些变量数据错综复杂,而且一不小心就容易引起安全隐患,但是如果利用好ThinkPHP提供的变量获取功能,就可以轻松的获取和驾驭变量了. ...

  2. Android通过反射打造能够存储不论什么对象的万能SharedPreferences

    我们通常使用SharedPreferences存储一些须要保存在本地.但又不至于存储在数据库里的一些数据.一般我们用它来存储一些username,password等数据是很方便的,那么假设我们想要存储 ...

  3. Units specified don't exist SHSUCDX can't install

    重装系统,出现“Units specified don't exist SHSUCDX can't install”怎么办? 昨天,我们领导弄了个联想Thinkpad T510i的笔记本,本来预装的是 ...

  4. 循环栅栏:CyclicBarrier(司令要求任务) 读书笔记

    可以理解为循环栅栏,栅栏就是一种障碍物.假如我们将计数器设置为10,那么凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程,这就是循环栅栏的含义. 构造器: public Cycli ...

  5. Vue中使用节流Lodash throttle

    在Vue中,有时需要对ajax请求提交进行节流操作.这时候,如果页面在请求成功之后会跳转,使用vue指令once或者加载一个loading遮罩禁止点击即可,但如果请求之后不跳转,并且loading不适 ...

  6. wap、app移动端页面常用html标签汇总

    1.section 将内容组织到精确的语义块,表示页面的一部分. 2.article article表示网页的一个文章.故事. 3.header (1)用在整页的页头 (2)section或者arti ...

  7. oracle 导入Excel数据

      oracle 导入excel数据 CreateTime--2018年1月30日14:58:51 Author:Marydon 通过plsql实现 1.准备工作 Excel中的字段名称,必须和表结构 ...

  8. ubuntu开启ftp服务

    首先再防火墙中开启21和20端口 iptables -A INPUT -p tcp --dport -j ACCEPT iptables -A INPUT -p tcp --dport -j ACCE ...

  9. 保护心灵窗口——防蓝光软件f.lux

    一款根据时间变化来自动改变屏幕色温的软件.让你在深夜也能感受到太阳的温暖,顺便还有助于睡眠.相较于花大价钱购置防蓝光屏或者防蓝光膜,这款软件还是excellent的 首先,概念科普(蓝光的危害就略略略 ...

  10. linux命令创建和修改用户及密码

    linux下创建用户 1.添加ftp用户 useradd ftpname -d /home/ftp passwd ftppwd 以下操作都以root权限进行: service vsftpd start ...