感觉我字符串和期望都不好……

题目链接

题意

有 \(n\) 种字符,给定一个模式串

\(S\) ,一开始字符串为空,现在每次随机生成一个 1~n 的字符添加到字符串末尾,直到出现 \(S\) 停止,问长度期望。

思路

首先对S预处理,求出失配数组 fail。

dp[i] 表示末尾匹配了 i 个S串的字符所需要的次数期望。

每次枚举可能出现的字符1~n。对于S字符串,i+1肯定是确定的字符,所以对于其他字符肯定是不匹配的。

假设现在生成了 k 字符,并且 k 字符不等于 S[i+1],那么根据 S 的 fail,假设有匹配 j 个字符,也就是说从匹配 j 个到匹配 i 个我们还要重新生成 dp[i] - dp[j] 次(期望)。

(从匹配i-1到匹配i个需要生成次数的期望)\(f(i)=1+\sum_{i=1}^n(dp[i-1]-dp[lose(k)])/n+\dfrac{n-1}{n}f(i)\)

(lose(k)为生成字符k的情况下匹配的字符数)

$ dp[i] = dp[i-1] + f(i)$ 。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=21;
int fail[N],n;
ll f[N];
char s[N]; void get_fail( char *s )
{
int p=0,len=strlen(s+1);
for ( int i=2; i<=len; i++ )
{
while ( p && s[p+1]!=s[i] ) p=fail[p];
if ( s[p+1]==s[i] ) p++;
fail[i]=p;
}
} int main()
{
int T; scanf( "%d",&T );
for ( int cas=1; cas<=T; cas++ )
{
printf( "Case %d:\n",cas );
scanf( "%d%s",&n,s+1 ); get_fail(s); f[0]=0; int len=strlen(s+1);
for ( int i=1; i<=len; i++ )
{
f[i]=f[i-1]+n;
for ( int j=0; j<n; j++ )
{
if ( s[i]=='A'+j ) continue;
int p=i-1;
while ( p && s[p+1]!=j+'A' ) p=fail[p];
if ( s[p+1]==j+'A' ) p++;
f[i]+=f[i-1]-f[p];
}
} printf( "%lld\n",f[len] );
if ( cas<T ) printf( "\n" );
}
}

【题解】Generator(UVA1358)的更多相关文章

  1. HDU 1014 Uniform Generator(题解)

    Uniform Generator Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. HDU 1014 Uniform Generator 题解

    找到规律之后本题就是水题了.只是找规律也不太easy的.证明这个规律成立更加不easy. 本题就是求step和mod假设GCD(最大公约数位1)那么就是Good Choice,否则为Bad Choic ...

  3. 2019牛客多校第五场C generator 2(BSGS)题解

    题意: 传送门 已知递推公式\(x_i = a*x_{i - 1} + b\mod p\),\(p\)是素数,已知\(x_0,a,b,p\),给出一个\(n\)和\(v\),问你满足\(x_i = v ...

  4. USACO Section 1.3 题解 (洛谷OJ P1209 P1444 P3650 P2693)

    usaco ch1.4 sort(d , d + c, [](int a, int b) -> bool { return a > b; }); 生成与过滤 generator&& ...

  5. Codeforces Round #556 题解

    Codeforces Round #556 题解 Div.2 A Stock Arbitraging 傻逼题 Div.2 B Tiling Challenge 傻逼题 Div.1 A Prefix S ...

  6. HDU 1014 Uniform Generator(模拟和公式)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1014 Uniform Generator Time Limit: 2000/1000 MS (Java ...

  7. Vulnhub靶场题解

    Vulnhub简介 Vulnhub是一个提供各种漏洞环境的靶场平台,供安全爱好者学习渗透使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行 ...

  8. 6398. 【NOIP2018模拟10.30】Generator(树状数组区间修改)

    题目描述 Description Input Output 输出 q 行,第 i 行表示数据 Di 的答案. Sample Input 4 3 2 1 1 2 4 2 1 2 1 1 3 5 2 2 ...

  9. 2019牛客暑期多校第五场题解ABGH

    A.digits 2 传送门 题意:给你一个n,要求输出一个每一位数字之和能整除n且其本身也能整除n的数.n不超过100,要求的数不超过10000位数. 题解:直接将n输出n次. 代码: #inclu ...

随机推荐

  1. 极客mysql02

    mysql 一条更新语句的执行过程: 1.首先客户端通过tcp/ip发送一条sql语句到server层的SQL interface 2.SQL interface接到该请求后,先对该条语句进行解析,验 ...

  2. Apache Shiro (Shiro-550)(cve_2016_4437)远程代码执行 - 漏洞复现

    0x00 漏洞原理 Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie.在服务端对rememberMe的cookie值, 先ba ...

  3. 希捷powerchoice磁盘休眠功能arm打包

    官方只提供了x86下面的包,没有提供arm下面的包,而我们的arm机器是32位的,需要编译一个支持armhf的二进制文件,这个文件只需要一个即可,但是编译是整套编译的,并且我们需要选定指定的版本,关闭 ...

  4. tp5获取当前域名

    //头部引入 use think\Request; //获取当前域名 $request = Request::instance(); $domain = $request->domain();

  5. ctf-misc-图片隐写术套路总结

    1.直接右键notepad打开,搜索flag,如果图片很多的话,可以写py脚本也    可以打开后搜索全部打开文件 2.是一个压缩包,改了后缀 3.图片中藏了一个二维码,用Stegsolve加几次滤镜 ...

  6. 使用Camtasia创作抖音卡点视频

    空闲的时候刷一刷抖音相信已经成为很多人的日常啦,抖音里面的视频形式多种多样,而其中的卡点视频更是被大家热烈追捧.如果你外出旅行拍摄了很多好看的照片,就很适合用卡点视频的形式展现出来. 如果你想要制作这 ...

  7. CorelDRAW常用工具之橡皮擦工具

    很多作图以及设计软件都会自带橡皮擦工具,但对于专业做平面设计的小伙伴来说,普通的橡皮工具肯定是无法满足日常作图需求的,今天来看看CorelDRAW的橡皮擦能玩出什么花样来. 1.擦除对象 CorelD ...

  8. guitar pro系列教程(二十七):Guitar Pro教程之理解记谱法

    前面的章节我们讲解了很多关于Guitar Pro'的功能使用,今天小编还是采用图文结合的方式为大家讲解它的理解记谱法,对于很多新人来说,在我们看谱之前,我们肯定要先熟悉他的一些功能如何使用以及一些关于 ...

  9. guitar pro系列教程(二十五):Guitar Pro教程之组织小节

    上一章节我们讲述了关于Guitar Pro 7的主界面的相关功能的介绍,对于初学作曲,又是吉他的初学者,刚刚接触Guitar Pro时,很多的功能,符号,工具都市不熟悉的,这样在创作,使用的过程中就会 ...

  10. idea中安装阿里巴巴的代码规范插件

    1.打开iead软件,从左上角点击File  ->  Settings  ->  Plugins 2.安装完成后,重启idea软件,即可正常使用了.