Solution -「SDOI 2017」「洛谷 P3706」硬币游戏
\(\mathscr{Description}\)
Link.
给定 \(n\) 个长度为 \(m\) 且两两不同的字符串 \(S_{1..n}\), 字符集 \(|\Sigma|=2\). 各位置独立在 \(\Sigma\) 中均匀随机, 生成一个足够长的字符串 \(T\), 对于每个 \(S_i\), 求 \(S_i\) 在 \(T\) 中第一次出现位置最靠前的概率.
\(n,m\le300\).
\(\mathscr{Solution}\)
感觉一直知道 PGF 但基本没有上手用过 qwq.
比较套路啦, 令 \(F_i(x)\) 表示 \(S_i\) 出现位置最靠前时, 其概率关于 \(|T|\) 的 PGF; \(G(x)\) 表示没有任何 \(S\) 出现时, 其概率关于 \(|T|\) 的 PGF. 我们的目标是求所有 \(F_i(1)\).
"\(T_i\) 被放出来的概率" = "\(|T|=i-1\) 时没有结束的概率":
\]
"从一个未结束状态向后再恰好延伸出一个 \(S_i\) 的概率" = "在放的过程中所有戛然而止 (某个 \(S_j\) 出现了) 的时候再向后强行补满未出现字符的概率":
\]
一起令 \(x=1\):
G(1)+\sum_iF_i(1)=1+G(1),\\
2^{-m}G(1)=\sum_j\sum_k[S_i[:k]=S_j[m-k+1:]]2^{k-m}F_j(1)&\forall i.
\end{cases}
\]
直接对总共 \(n+1\) 个变量消元即可. 复杂度 \(\mathcal O(n^2(n+m))\).
\(\mathscr{Code}\)
/*+Rainybunny+*/
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l, rep##i = r; i <= rep##i; ++i)
#define per(i, r, l) for (int i = r, per##i = l; i >= per##i; --i)
typedef unsigned long long ULL;
const int MAXN = 300;
const ULL BASE = 127;
int n, m;
ULL hpw[MAXN + 5], hsh[MAXN + 5][MAXN + 5];
double mat[MAXN + 5][MAXN + 5], pwr[MAXN + 5], ans[MAXN + 5];
inline void init() {
hpw[0] = 1;
rep (i, 1, m) hpw[i] = hpw[i - 1] * BASE;
pwr[0] = 1;
rep (i, 1, m) pwr[i] = 0.5 * pwr[i - 1];
}
inline ULL calc(const int i, const int l, const int r) {
return hsh[i][r] - hpw[r - l + 1] * hsh[i][l - 1];
}
inline void gauss() {
rep (i, 0, n) {
int p = i;
rep (j, i + 1, n) if (fabs(mat[p][i]) < fabs(mat[j][i])) p = j;
if (i != p) std::swap(mat[p], mat[i]);
rep (j, i + 1, n) {
double t = mat[j][i] / mat[i][i];
rep (k, i, n + 1) mat[j][k] -= t * mat[i][k];
}
}
per (i, n, 0) {
ans[i] = mat[i][n + 1] / mat[i][i];
rep (j, 0, i - 1) mat[j][n + 1] -= ans[i] * mat[j][i];
}
}
int main() {
scanf("%d %d", &n, &m), init();
rep (i, 1, n) {
static char str[MAXN + 5];
scanf("%s", str + 1);
rep (j, 1, m) hsh[i][j] = hsh[i][j - 1] * BASE + str[j];
}
rep (i, 1, n) {
mat[i][0] = -pwr[m];
rep (j, 1, n) {
rep (k, 1, m) if (calc(i, 1, k) == calc(j, m - k + 1, m)) {
// printf("%d %d %d\n", i, j, k);
mat[i][j] += pwr[m - k];
}
}
}
rep (i, 1, n + 1) mat[0][i] = 1.;
gauss();
rep (i, 1, n) printf("%.12f\n", ans[i]);
return 0;
}
Solution -「SDOI 2017」「洛谷 P3706」硬币游戏的更多相关文章
- 洛谷P3706 [SDOI2017]硬币游戏(概率生成函数+高斯消元)
题面 传送门 题解 不知道概率生成函数是什么的可以看看这篇文章,题解也在里面了 //minamoto #include<bits/stdc++.h> #define R register ...
- 洛谷 3706 [SDOI2017]硬币游戏——思路
题目:https://www.luogu.org/problemnew/show/P3706 题解:https://blog.csdn.net/gjghfd/article/details/80355 ...
- 洛咕 P3706 [SDOI2017]硬币游戏
假设f[i]是第i个同学胜利的概率,也就是随机序列第一个匹配到s[i]的概率 假设前面有一个字符串\(S\),(假设无限长但没有匹配),现在往后面要加上第i个串\(s[i]\),这个的概率设为\(P_ ...
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)
[CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...
- 洛谷P1118 数字三角形游戏
洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直 ...
- 洛谷P1274-魔术数字游戏
Problem 洛谷P1274-魔术数字游戏 Accept: 118 Submit: 243Time Limit: 1000 mSec Memory Limit : 128MB Probl ...
- 洛谷P1288 取数游戏II(博弈)
洛谷P1288 取数游戏II 先手必胜的条件需要满足如下中至少 \(1\) 条: 从初始位置向左走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 从初始位置向右走到第一 ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- Solution -「洛谷 P4372」Out of Sorts P
\(\mathcal{Description}\) OurOJ & 洛谷 P4372(几乎一致) 设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...
随机推荐
- 关于C语言指针类型的总结
前言 我个人将目前在C语言中所遇到的指针归类为8种,至于为何写第九点,是因为我个人认为第九点极容易与第五点混淆,故总结如下: 1.普通指针 普通指针即最常见的如:int * . char*等 甚至于也 ...
- 搞清楚这个老六的真面目!逐层‘剥开’人工智能中的卷积神经网络(CNN)
第三章:超越基础--图像中的特征检测 上一篇<揭开计算机视觉的神秘面纱,原来机器是这样"看图"的!> 本篇序言:上一篇我们实现并训练了一个神经网络,成功让计算机&quo ...
- Centos7安装Mysql5.7.42
安装前的清理 查看是否安装了Mysql版本 [root@localhost ~]# yum list installed mysql* [root@localhost ~]# rpm –qa|grep ...
- 从零开始学逆向CTF比赛,免费参加,欢迎来玩!
大家好,我是轩辕. 告诉大家一个好消息:我准备了一次逆向CTF比赛,面向所有人开放,无需购买课程,优秀的小伙伴还有奖励,参赛方式在文末会介绍,欢迎大家一起来玩. 举办这次CTF比赛,是为了检验大家从零 ...
- setTimeout 的方式实现 setInteval
setTimeout(function fn(){ setTimeout(fn,interval); },interval); 这个模式链式调用了setTimeout(),每次函数执行的时候都会创建一 ...
- 内网 BitTorrent 下载环境搭建——基于 Transmission
背景 前段时间为公司的产品增加了磁力链.种子下载的能力,测试时发现网上搜到的热门种子,有时好用,有时不好用,不好用主要表现在:没速度.速度慢.速度不稳定.下载一部分后没速度等,严重拖累了测试工作.为此 ...
- 我的neovim配置
init.vim " Vim with all enhancements "文件管理器,我想试一下ranger syntax enable syntax on let maplea ...
- apache做负载均衡器 配置
将Apache作为LoadBalance前置机分别有三种不同的部署方式,分别是: 1 )轮询均衡策略的配置 进入Apache的conf目录,打开httpd.conf文件,在文件的末尾加入: Proxy ...
- JS之Class类
转载:https://juejin.cn/post/7098891689955164168 ECMAScript 6 提供了更接近传统语言的写法,新引入的class关键字具有正式定义类的能力.类(cl ...
- 痞子衡嵌入式:简析i.MXRT1170 XECC开启及Data Swap功能对于外部RAM的访问性能影响
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170 XECC开启及Data Swap功能对于外部RAM的访问性能影响. 文接上篇 <i.MXRT1170 XEC ...