题目: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 ;
}

bzoj 2553 [BeiJing2011]禁忌——AC自动机+概率DP+矩阵的更多相关文章

  1. BZOJ2553[BeiJing2011]禁忌——AC自动机+概率DP+矩阵乘法

    题目描述 Magic Land上的人们总是提起那个传说:他们的祖先John在那个东方岛屿帮助Koishi与其姐姐Satori最终战平.而后,Koishi恢复了读心的能力…… 如今,在John已经成为传 ...

  2. bzoj 2553: [BeiJing2011]禁忌 AC自动机+矩阵乘法

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2553 题解: 利用AC自动机的dp求出所有的转移 然后将所有的转移储存到矩阵中,进行矩阵 ...

  3. 【BZOJ2553】[BeiJing2011]禁忌 AC自动机+期望DP+矩阵乘法

    [BZOJ2553][BeiJing2011]禁忌 Description Magic Land上的人们总是提起那个传说:他们的祖先John在那个东方岛屿帮助Koishi与其姐姐Satori最终战平. ...

  4. 【BZOJ】2553: [BeiJing2011]禁忌 AC自动机+期望+矩阵快速幂

    [题意]给定n个禁忌字符串和字符集大小alphabet,保证所有字符在集合内.一个字符串的禁忌伤害定义为分割能匹配到最多的禁忌字符串数量(一个可以匹配多次),求由字符集构成的长度为Len的字符串的期望 ...

  5. 【BZOJ1444】[Jsoi2009]有趣的游戏 AC自动机+概率DP+矩阵乘法

    [BZOJ1444][Jsoi2009]有趣的游戏 Description Input 注意 是0<=P Output Sample Input Sample Output HINT  30%的 ...

  6. BZOJ1444[Jsoi2009]有趣的游戏——AC自动机+概率DP+矩阵乘法

    题目描述 输入 注意 是0<=P, n , l, m≤ 10. 输出 样例输入 input 1 3 2 2 1 2 1 2 AB BA AA input 2 3 4 2 1 2 1 2 AABA ...

  7. 【BZOJ 2553】[BeiJing2011]禁忌 AC自动机+期望概率dp

    我一开始想的是倒着来,发现太屎,后来想到了一种神奇的方法——我们带着一个既有期望又有概率的矩阵,偶数(2*id)代表期望,奇数(2*id+1)代表概率,初始答案矩阵一列,1的位置为1(起点为0),工具 ...

  8. BZOJ 1444 [Jsoi2009]有趣的游戏 (AC自动机 + 概率DP + Gauss)

    1444: [Jsoi2009]有趣的游戏 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1382  Solved: 498[Submit][Statu ...

  9. BZOJ2553 [BeiJing2011]禁忌 AC自动机 矩阵

    原文链接http://www.cnblogs.com/zhouzhendong/p/8196279.html 题目传送门 - BZOJ2553 题意概括 引用一下lych大佬的: 在字母只有前alph ...

随机推荐

  1. Python 基础的应用day2

    1 用户交互input,将用户输入的内容赋值给 name 变量 后只能是字符串str.      区别2和3: ps :python2:raw_input python3:input 例 :1 nam ...

  2. js 自执行匿名函数(转载)

    自执行匿名函数: 常见格式:(function() { /* code */ })(); 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命 ...

  3. SpringBoot(一) 入门篇,简单配置

    编辑工具:Intellij IDEA 一.SpringBoot的应用: 1.创建文件 2.项目结构 3.开始构建springboot项目,项目结构 第一步创建Person类: package com. ...

  4. git命令学习

    git init:把当前目录变成Git可以管理的仓库git add file:把文件添加到仓库git commit -m "描述语句":把文件提交到仓库git status:该命令 ...

  5. php 安装过程 第二次探索

    由于第一次安装过程写的比较乱,再做整理 1.phpstudy 才是正确姿势. http://phpstudy.php.cn/ 官网下载.  phpstrom 中配置 php为 phpstudy目录下 ...

  6. 4--Selenium环境准备---chromedriver.exe 与chrome版本匹配

    0.jdk8 和eclipse 4.6 https://www.eclipse.org/downloads/packages/release/neon/3 1.selenium-server-stan ...

  7. 【Python】Excel-4(样式设置)

    #练习: #封装一个ExcelUtil的模块(构造函数是excel的路径),里面提供封装的方法: #1 获取某个sheet对象 #2 打印所有sheet名称 #3 给某个sheet的某个单元格写入内容 ...

  8. Samsung_tiny4412(驱动笔记03)----字符设备驱动基本操作及调用流程

    /*********************************************************************************** * * 字符设备驱动基本操作及 ...

  9. Unity等待写入数据

    EasyTouch中QuickGesture的用法 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Qu ...

  10. ACM C++

    杭电oj 2000 sort(a,a+sizof(a)); 对数组a中元素进行排序,参数1,2分别为要排序数组首末地址 故sort句换成下行也通过 sort(a,&a[3]); ac代码 // ...