题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2553

看了题解才会……

首先,给定一个串,最好的划分方式是按禁忌串出现的右端点排序,遇到能填的就填上。在 AC 自动机上就是一旦能走到一个禁忌串的终止节点,就 ans++ 并走到根去。

考虑怎么把 ans++ 也体现在矩阵乘法里。而且还要期望……

只要在矩阵里填上概率,最后就能算出期望了。体现 ans++ 的话,就是在 “从当前节点到根” 的同时给 “从当前节点到 tot ” 的概率也加上 \( \frac{1}{alphabet} \) 即可。

最后就看一下乘了 len 次之后从根走到 tot 点的值即可。

听说要开 long double 。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define db long double
using namespace std;
const int N=,K=;
int n,m,alp,tot=,c[N][K],fl[N],q[N]; db p;
char ch[N]; bool en[N];
struct Mtr{
db a[N][N];
Mtr(){for(int i=;i<=tot;i++)for(int j=;j<=tot;j++)a[i][j]=;};
Mtr operator* (const Mtr &b)const
{
Mtr c;
for(int i=;i<=tot;i++)
for(int k=;k<=tot;k++)
for(int j=;j<=tot;j++)
c.a[i][j]+=a[i][k]*b.a[k][j];
return c;
}
}t,ans;
void get_fl()
{
int he=,tl=;
for(int j=;j<alp;j++)
if(c[][j])q[++tl]=c[][j],fl[c[][j]]=;
else c[][j]=;
while(he<tl)
{
int k=q[++he]; if(en[fl[k]])en[k]=;
for(int j=;j<alp;j++)
{
if(c[k][j])
{
int cr=fl[k];
while(cr&&!c[cr][j])cr=fl[cr];
if(c[cr][j])fl[c[k][j]]=c[cr][j];
else fl[c[k][j]]=;
q[++tl]=c[k][j];
}
else
{
int cr=fl[k];
while(cr&&!c[cr][j])cr=fl[cr];
if(c[cr][j])c[k][j]=c[cr][j];
else c[k][j]=;
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&alp); p=1.0/alp;
for(int i=;i<=n;i++)
{
scanf("%s",ch+);
int d=strlen(ch+), cr=;
for(int j=;j<=d;j++)
{
int w=ch[j]-'a';
if(!c[cr][w])c[cr][w]=++tot;
cr=c[cr][w];
}
en[cr]=;
}
get_fl(); tot++; t.a[tot][tot]=;
for(int i=;i<tot;i++)
for(int j=;j<alp;j++)
{
if(en[c[i][j]]){ t.a[i][]+=p; t.a[i][tot]+=p;}
else t.a[i][c[i][j]]+=p;
}
ans=t; m--;
while(m)
{
if(m&)ans=ans*t; t=t*t;m>>=;
}
printf("%.10Lf\n",ans.a[][tot]);
return ;
}

最新文章

  1. python gui之tkinter事件处理
  2. PHP的autoload机制的实现解析
  3. Java中this关键字的使用
  4. html5—— 应用程序缓存
  5. Linux C 文件与目录2 文件的打开与关闭
  6. 【转】发布的QT程序无法显示图标和图片的问题
  7. CF 353C Find Maximum #205 (Div. 2)
  8. mysql中bigint在php中表示
  9. Hackerrank 2020 February 2014 解题报告
  10. oracle创建表空间,用户,授权等
  11. 基于方法的LINQ语句
  12. 简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)
  13. UVA11549 计算机谜题(Floyd判圈算法)
  14. 常用SQL笔记总结
  15. Python print 输出到控制台 丢数据
  16. ORA-00936: missing expression
  17. MongoDB用户及数据库管理命令
  18. Kali学习笔记22:缓冲区溢出漏洞利用实验
  19. layui(三)——laypage组件常见用法总结
  20. SQL注入学习资料总结

热门文章

  1. 20165214 学习基础与C语言基础调查
  2. 2019.1.23 DFMEA for
  3. 关于 数据库 my_slq的 安装及其卸载
  4. win10---cmd终端下连接ubantu--SSH SERVER服务
  5. centos安装pip扩展包
  6. Spring MVC之ResposeEntity下载文件
  7. shell统计当前文件夹下的文件个数、目录个数
  8. pandas-cheat-sheet
  9. HDU - 3982:Harry Potter and J.K.Rowling(半平面交+圆与多边形求交)(WA ing)
  10. s21day05 python笔记