题目: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=80,K=30;
int n,m,alp,tot=1,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=1;i<=tot;i++)for(int j=1;j<=tot;j++)a[i][j]=0;};Mtr operator* (const Mtr &b)const{Mtr c;for(int i=1;i<=tot;i++)for(int k=1;k<=tot;k++)for(int j=1;j<=tot;j++)c.a[i][j]+=a[i][k]*b.a[k][j];return c;}
}t,ans;
void get_fl()
{int he=0,tl=0;for(int j=0;j<alp;j++)if(c[1][j])q[++tl]=c[1][j],fl[c[1][j]]=1;else c[1][j]=1;while(he<tl){int k=q[++he]; if(en[fl[k]])en[k]=1;for(int j=0;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]]=1;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]=1;}}}
}
int main()
{scanf("%d%d%d",&n,&m,&alp); p=1.0/alp;for(int i=1;i<=n;i++){scanf("%s",ch+1);int d=strlen(ch+1), cr=1;for(int j=1;j<=d;j++){int w=ch[j]-'a';if(!c[cr][w])c[cr][w]=++tot;cr=c[cr][w];}en[cr]=1;}get_fl(); tot++; t.a[tot][tot]=1;for(int i=1;i<tot;i++)for(int j=0;j<alp;j++){if(en[c[i][j]]){ t.a[i][1]+=p; t.a[i][tot]+=p;}else t.a[i][c[i][j]]+=p;}ans=t; m--;while(m){if(m&1)ans=ans*t; t=t*t;m>>=1;}printf("%.10Lf\n",ans.a[1][tot]);return 0;
}

转载于:https://www.cnblogs.com/Narh/p/10687543.html

bzoj 2553 [BeiJing2011]禁忌——AC自动机+概率DP+矩阵相关推荐

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

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

  2. BZOJ 2553: [BeiJing2011]禁忌【ACAM + 期望dp + 矩快优化

    --反正瞎瘠薄搞搞,都是显然的 #pragma GCC optimize(3) #include<bits/stdc++.h> #define MAXN 80 using namespac ...

  3. AC自动机 + 概率dp + 高斯消元 --- HDU 5955 or 2016年沈阳icpc H [AC自动机 + 概率dp + 高斯消元]详解

    题目链接 题目大意: 就是有NNN个人,每个人都会猜一个长度为LLL的只包含{1,2,3,4,5,6}\{1,2,3,4,5,6\}{1,2,3,4,5,6}的序列,现在裁判开始投掷骰子,并且把每次的 ...

  4. UVa 11468 (AC自动机 概率DP) Substring

    将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. 1 #include < ...

  5. 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 682  Solved: 364 Description 我们称 ...

  6. 【bzoj3530】[Sdoi2014]数数 AC自动机+数位dp

    题目描述 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运 ...

  7. 【BZOJ3530】数数(SDOI2014)-AC自动机+数位DP

    测试地址:数数 做法:本题需要用到AC自动机+数位DP. 首先看到多模式串匹配,自然想到用AC自动机来做.用AC自动机构造出状态转移图后,令f(i,j,k)f(i,j,k)f(i,j,k)为匹配了最高 ...

  8. 【BZOJ2553】禁忌,AC自动机+期望DP+矩乘

    传送门 先考虑选最多禁忌串的问题 感受一下,如果禁忌串之间没有包含关系,一定是可以从前往后贪心搞的,直接建AC自动机跑匹配,找到一个禁忌串的末尾就回到根上,并把禁忌串数量+1 (所以起初我想的是把包含 ...

  9. BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...

最新文章

  1. 这次中兴也藏了“备胎”!国产操作系统迎出头之日,即将规模商用
  2. 十个 SCP 传输命令例子
  3. putty 配置导出
  4. mysql主从复制运维_Mysql主从复制配置
  5. Cpp 对象模型探索 / delete 运算符内部调用过程分析
  6. LeetCode 713. 乘积小于K的子数组(滑动窗口)
  7. docker公共存储库_Docker入门(2)——镜像结构和私有镜像库
  8. NGINX访问日志和错误日志
  9. 目标追踪论文之狼吞虎咽(4):MCCT算法
  10. X线、CT、B超、核磁共振区别
  11. MathType注册表位置
  12. html5 等比压缩图片,图片上传裁剪amp;等比缩放处理(html5+Canvas)
  13. 每日刷题之数独简单版 AcWing 1613
  14. 夏季 肝病患者养生保健重点在哪 请详解
  15. 【十一】一文带你迅速掌握锁策略
  16. Axure 交互设计 (1)
  17. Unity 3d网游画面的3d效果
  18. 算法实战(一)两数之和
  19. 操作系统编程实践总结
  20. 关于genvar及generate用法的总结【Verilog】

热门文章

  1. 电气装置安装工程接地装置施工及验收规范_(册说明)电气设备安装工程
  2. JavaScript循环结构(1)
  3. python生成倒计时图片_python pygame--倒计时
  4. 计算机网络—CSMA/CA协议
  5. 第九届蓝桥杯省赛C++A组第二题 ---星期一
  6. 蛮力法 —— 求解迷宫问题 —— DFS和BFS
  7. 牛客练习赛21:B. 黑妹的游戏II(博弈DP)
  8. 单纯型法Ⅱ(bzoj 1061: [Noi2008]志愿者招募)
  9. python机器学习库sklearn——模型评估
  10. jquery中的attr函数attr(name)、attr(key,value)、attr(properties)、attr(key,fn)、removeAttr