题目: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. PMS5003ST+Arduino Nano OLED屏显示

    整合OLED显示和PMS5003报数 #include <Arduino.h> #include <pms.h> /////////////////////////////// ...

  2. Linux:进程

    进程 一.简略操作 1.查看进程:ps2.查看进程资源占用量:top3.查看进程关系(进程树):pstree4.查看当前系统信息:uname -a 二.详细操作 1.查看进程:ps 2.查看进程资源占 ...

  3. react 学习笔记 npm 命令

    第一步: cnpm install --save react react-dom babelify babel-preset-react 第二步: 安装es2015 cnpm install babe ...

  4. 用Java批量重命名文件

    要事先在C盘里创建“照片”和“照片1”两个文件夹 1import java.io.*; public class Jack { public static void main(String[] arg ...

  5. 大数据-01-安装Hadoop

    环境 服务器:ubuntu-16.04.3-desktop-amd64.iso 创建hadoop用户 sudo useradd -m hadoop -s /bin/bash 本文中会大量使用到sudo ...

  6. html 调用ocx控件

    !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/x ...

  7. 常用文本编辑器 editor 的常用插件 —— CopyEdit

    1. CopyEdit http://www.conyedit.com/, 跨平台的文本编辑器插件: 监控粘贴板以及支持命令解析 其官网上有其动图演示:

  8. 洛谷P2051 中国象棋(dp)

    题目链接:传送门 题目大意: 在N行M列的棋盘中放象棋中的“炮”,问要使得“炮”两两互不伤害,有多少种放法. 1 ≤ n,m ≤ 100,答案对9999973取模. 思路: 按行更新答案.每行炮可以放 ...

  9. C语言--第六周作业评分和总结(5班)

    作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1250 一.评分要求 要求1 完成PTA第六周所有题,若存在抄袭现象,倒扣此题 ...

  10. XTU1254 Blance 如何实现称出1∼n 克的物品,请问最少需要几颗砝码?

    题目描述 小明有一架天平,小明想称出1∼n 克的物品,请问最少需要几颗砝码? 比如小明想称出1∼4 克的物品,需要2颗砝码,为1和3克. balance 输入 第一行是一个整数T(1≤T≤10000) ...