博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Contest20170910]string
阅读量:6305 次
发布时间:2019-06-22

本文共 1459 字,大约阅读时间需要 4 分钟。

给定一个由且仅由字符$'H','T'$构成的字符串$S$

给定一个最初为空的字符串$T$,每次随机地在$T$的末尾添加$'H'$或者$'T'$

问当$S$为$T$的后缀时,在末尾添加字符的期望次数

 

妙啊!

设$f_i(0\leq i \leq n-1)$表示(在$T$的末尾匹配$S_{1\cdots i}$)到(在$T$的末尾匹配$S_{1\cdots i+1}$)期望添加多少个字符

①有$\frac12$的概率直接匹配,需要添加$1$个字符

②另外$\frac12$的概率失配,需要添加更多字符

我们来看看②,为了解决问题,我们引入$go_{i,j}(0\leq i\leq n-1,j\in\{'H','T'\})$表示当已经在$T$的末尾匹配$S_{1\cdots i}$时在$T$的末尾添加字符$j$能匹配到的最远位置

首先假设我们计算好了$go_{1\cdots i-1,'H'\cdots'T'}$,想计算$go_{i,'H'\cdots'T'}$

若$S_{i+1}='H'$,则$go_{i,'H'}=i+1$,$go_{i,'T'}=go_{next_i,'T'}$

若$S_{i+1}='T'$,则$go_{i,'H'}=go_{next_i,'H'}$,$go_{i,'T'}=i+1$

其中$next_i$代表最大的$k\lt i$使得$S_{1\cdots k}=S_{i-k+1\cdots i}$,与kmp中的$next$含义相同

有了$go_{i,j}$,我们现在可以解决②了

失配之后用$go_{i,j}$找到再次匹配的位置,然后一路添加字符直到到达$S_{i+1}$

若$S_{i+1}='H'$,则$f_i=\frac12+\frac12(1+\sum\limits_{go_{i,'T'}\leq j\leq i}f_j)$

整理得$f_i=2+\sum\limits_{go_{i,'T'}\leq j\leq i-1}f_j$

若$S_{i+1}='T'$,则$f_i=\frac12+\frac12(1+\sum\limits_{go_{i,'H'}\leq j\leq i}f_j)$

整理得$f_i=2+\sum\limits_{go_{i,'H'}\leq j\leq i-1}f_j$

综上,我们先用kmp预处理出$next_i$,然后用$next_i$预处理出$go_{i,j}$,最后用$go_{i,j}$算出$f_i$

递推中的$\sum$边算边累加即可,最后的答案为$f_0+f_1+\cdots+f_{n-1}$

#include
#include
#define mod 1000000007char s[1000010];int pi[1000010],f[1000010],sumf[1000010],go[1000010][2],n,i,j;int main(){ scanf("%s",s+1); n=strlen(s+1); pi[1]=0; j=0; for(i=2;i<=n;i++){ while(j&&s[i]!=s[j+1])j=pi[j]; if(s[i]==s[j+1])j++; pi[i]=j; } //0:H 1:T for(i=0;i

转载于:https://www.cnblogs.com/jefflyy/p/7501277.html

你可能感兴趣的文章
区分指针、变量名、指针所指向的内存
查看>>
异步编程的世界
查看>>
最近话题火爆的四件事你知道不?
查看>>
SpringBoot整合MyBatis
查看>>
云计算产业如何率先推行信用管理?
查看>>
Android 类库书签更新(一)
查看>>
Unity3D Input按键系统
查看>>
简单的一条SQL,不简单的做事思维 NOT IN 、NOT EXISTS、LEFT JOIN用法差别 ...
查看>>
DataWorks:任务未运行自助排查
查看>>
ionic/cordova热部署
查看>>
「镁客早报」特斯拉裁员,马斯克解释没有办法;微软推出Azure DevOps赏金计划...
查看>>
Flink入坑指南第五章 - 语法糖 view
查看>>
centos 7.4 使用 pgxc_ctl 安装与使用
查看>>
Redis 单key值过大 优化方式
查看>>
【数据库】表分区
查看>>
nutz-sqltpl 1.3.4.RELEASE 发布,在 Nutz 项目中“解决 Java 拼接 SQL”问题
查看>>
城市 | 800个地铁站数据透析的京沪白领图鉴:隐形土豪、无产中产阶级和猪猪女孩...
查看>>
前端脚本!网站图片素材中文转英文
查看>>
linux的常用易忘命令
查看>>
PHP 分割字符串
查看>>