[Contest20170910]string
给定一个由且仅由字符$'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<stdio.h>
#include<string.h>
#define mod 1000000007
char 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<n;i++){
if(s[i+1]=='H'){
go[i][0]=i+1;
go[i][1]=go[pi[i]][1];
}else{
go[i][0]=go[pi[i]][0];
go[i][1]=i+1;
}
}
f[0]=2;
sumf[0]=2;
for(i=1;i<n;i++){
if(s[i+1]=='H')
f[i]=(2+sumf[i-1]-(go[i][1]?sumf[go[i][1]-1]:0))%mod;
else
f[i]=(2+sumf[i-1]-(go[i][0]?sumf[go[i][0]-1]:0))%mod;
sumf[i]=(sumf[i-1]+f[i])%mod;
}
printf("%d",(sumf[n-1]+mod)%mod);
}
[Contest20170910]string的更多相关文章
- 透过WinDBG的视角看String
摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...
- JavaScript String对象
本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...
- ElasticSearch 5学习(9)——映射和分析(string类型废弃)
在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...
- js报错: Uncaught RangeError: Invalid string length
在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...
- c# 字符串连接使用“+”和string.format格式化两种方式
参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...
- 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...
- JavaScript中String对象的方法介绍
1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...
- 在多线程编程中lock(string){...}隐藏的机关
常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...
随机推荐
- ASP.NET AjaxControlToolkit-Framework4.0 配置实用(简单介绍CalendarExtender日期控件)
1:下载:AjaxControlToolkit Ajax Control Toolkit .NET 4 Ajax Control Toolkit .NET 4.5 Ajax Control Toolk ...
- Angular2.0 基础: Form
对于Angular2.0 的Form表单中的隐藏和验证,个人觉得还是挺有意思的. 1.通过ngModel 跟踪修改状态与验证. 在表单中使用 ngModel 可以获得更多的控制权,包括一些常用的验证. ...
- LCD实验学习笔记(八):中断
s3c2440有60个中断源(其中15个为子中断源). 31个32位的通用寄存器,6个程序状态寄存器.有6种工作模式(系统/用户模式,快中断模式,管理模式,数据访问中止模式,中断模式,未定指令中止模式 ...
- 【目录】Python自动化运维
目录:Python自动化运维笔记 Python自动化运维 - day2 - 数据类型 Python自动化运维 - day3 - 函数part1 Python自动化运维 - day4 - 函数Part2 ...
- humble_USACO
Humble Numbers For a given set of K prime numbers S = {p1, p2, ..., pK}, consider the set of all num ...
- device tree property ---- interrupt-names
device tree source 的 interrupt-names property 會對應到 pltform_get_irq_byname() 的第二個參數. .dtsi or .dts in ...
- mongodb-linux-x86_64
卷 DataDisk 的文件夹 PATH 列表卷序列号为 4A8E-D95CD:.│ 1.txt│ GNU-AGPL-3.0│ MPL-2│ README│ THIRD-PARTY-NOTI ...
- HDU 6186 CS Course 前缀和,后缀和
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6186 题意:给了n个数,然后有q个查询,每个查询要求我们删掉一个数,问删掉这个数后整个序列的与值,或值 ...
- Struts2学习笔记04 之 拦截器
一.创建拦截器组件 1. 创建一个类,实现Interceptor接口,并实现intercept方法 2.注册拦截器 3.引用拦截器 二.拦截器栈 预置拦截器: 默认引用拦截器 拦截器调用顺序: Fil ...
- spring使用aop需要的jar包,和常见异常
3.0以后spring不再一起发布aop依赖包,需要自己导入: 必须包: 这几个jar包分别为 1.org.springframework.aop-3.1.1.RELEASE 这个是spring的 ...