上海智能网站建设公司怎么进wordpress后台
上海智能网站建设公司,怎么进wordpress后台,社群营销的十大步骤,平罗县住房和城乡建设局网站题意#xff1a;给 nnn 个长度为 mmm 的 01 串#xff0c;一个 01 串初始为空#xff0c;不断随机一个字符加在后面#xff0c;当出现给定的 nnn 个串中的一个时停止。分别求在 nnn 个串处停止的概率。
考场思路历程#xff1a;
显然建出 AC 自动机#xff08;flag给 nnn 个长度为 mmm 的 01 串一个 01 串初始为空不断随机一个字符加在后面当出现给定的 nnn 个串中的一个时停止。分别求在 nnn 个串处停止的概率。
考场思路历程
显然建出 AC 自动机flag
然后发现变成了 CF113D Museum有个 O((nm)3)O((nm)^3)O((nm)3) 的做法
考虑方程有什么特殊性质
在 trie 树上要么往下走一步要么往上走
也就是说是 Linear Creature 的二叉树版。
然后发现要求任意点出发所有点的出现次数期望不弱于原问题无法推广。
矩阵中有值的位置是 O(n)O(n)O(n) 的。
但是是竖着放的没时间了没仔细想。
正解
既然方程的特殊性质不好优化考虑直接想办法求出 nnn 个答案的方程。
设 PiP_{i}Pi 为第 iii 个串的期望出现次数即概率即答案。特别地记 P0P_0P0 为所有未终止状态即 AC 自动机上无标记的点的期望长度即期望出现次数之和。
考虑对 PiP_iPi 建立方程。
无视掉走到就终止的条件考虑所有未终止状态往后面按 SiS_iSi 走 mmm 步得到了一个状态的可重集注意有些状态可能不合法但也算在内不过都在 AC 自动机上。
从这个过程来考虑因为限制了后面 mmm 步的走法这些状态的期望出现次数之和就是 12mP0\frac{1}{2^m}P_02m1P0。
如果过程中没有到过终止状态那么就是 PiP_iPi。否则我们枚举第一个终止状态以及是走了几步达到的设达到的串为 SjS_jSj注意 i,ji,ji,j 可以相等是走了 kkk 步后达到的因为所有串长相等所以此时一定是合法状态。然后就在 PjP_jPj 的基础上继续走 m−km-km−k 步。
得到方程
12mP0Pi∑j1n∑k1m−1[Si,1∼kSj,m−k1∼m]Pj2m−k\frac{1}{2^m}P_0P_i\sum_{j1}^n\sum_{k1}^{m-1}[S_{i,1\sim k}S_{j,m-k1\sim m}]\frac{P_j}{2^{m-k}}2m1P0Pij1∑nk1∑m−1[Si,1∼kSj,m−k1∼m]2m−kPj
然后对每对 i,ji,ji,j 跑个 kmp 就可以了。
什么终止状态的长度小于 m−km-km−k 怎么办反正只有有限个忽略好了。
然后再加一个 ∑i1nPi1\sum _{i1}^ nP_i1∑i1nPi1 的方程来得到数值一共有 n1n1n1 个方程和 n1n1n1 个未知数高斯消元解出来就可以了。
#include iostream
#include cstdio
#include cstring
#include cctype
#include cmath
#define MAXN 305
using namespace std;
char s[MAXN][MAXN];
int n,m;
double pw[MAXN],a[MAXN][MAXN];
int nxt[MAXN];
void gauss(int n)
{for (int i0;in;i){int posi;for (int ji1;jn;j) if (fabs(a[j][i])fabs(a[pos][i])) posj;if (posi) swap(a[i],a[pos]);for (int j0;jn;j)if (i!j){double ta[j][i]/a[i][i];for (int ki;kn;k) a[j][k]-t*a[i][k];}}
}
int main()
{scanf(%d%d,n,m);for (int i1;in;i) scanf(%s,s[i]1);pw[0]1;for (int i1;im;i) pw[i]pw[i-1]/2;for (int i1;in;i){a[i][0]-pw[m];a[i][i]1;int pos0;for (int j2;jm;j){while (poss[i][j]!s[i][pos1]) posnxt[pos];if (s[i][j]s[i][pos1]) nxt[j]pos;else nxt[j]0;}for (int j1;jn;j){pos0;for (int k1;km;k){while (poss[j][k]!s[i][pos1]) posnxt[pos];if (s[j][k]s[i][pos1]) pos;}if (ij) posnxt[pos];for (;pos;a[i][j]pw[m-pos],posnxt[pos]);}a[n1][i]1;}a[n1][n1]1;gauss(n1);for (int i1;in;i) printf(%.10f\n,a[i][n1]/a[i][i]);return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90624.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!