bzoj 2553 [BeiJing2011]禁忌——AC自动机+概率DP+矩阵
题目: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+矩阵的更多相关文章
- BZOJ2553[BeiJing2011]禁忌——AC自动机+概率DP+矩阵乘法
题目描述 Magic Land上的人们总是提起那个传说:他们的祖先John在那个东方岛屿帮助Koishi与其姐姐Satori最终战平.而后,Koishi恢复了读心的能力…… 如今,在John已经成为传 ...
- bzoj 2553: [BeiJing2011]禁忌 AC自动机+矩阵乘法
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2553 题解: 利用AC自动机的dp求出所有的转移 然后将所有的转移储存到矩阵中,进行矩阵 ...
- 【BZOJ2553】[BeiJing2011]禁忌 AC自动机+期望DP+矩阵乘法
[BZOJ2553][BeiJing2011]禁忌 Description Magic Land上的人们总是提起那个传说:他们的祖先John在那个东方岛屿帮助Koishi与其姐姐Satori最终战平. ...
- 【BZOJ】2553: [BeiJing2011]禁忌 AC自动机+期望+矩阵快速幂
[题意]给定n个禁忌字符串和字符集大小alphabet,保证所有字符在集合内.一个字符串的禁忌伤害定义为分割能匹配到最多的禁忌字符串数量(一个可以匹配多次),求由字符集构成的长度为Len的字符串的期望 ...
- 【BZOJ1444】[Jsoi2009]有趣的游戏 AC自动机+概率DP+矩阵乘法
[BZOJ1444][Jsoi2009]有趣的游戏 Description Input 注意 是0<=P Output Sample Input Sample Output HINT 30%的 ...
- 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 ...
- 【BZOJ 2553】[BeiJing2011]禁忌 AC自动机+期望概率dp
我一开始想的是倒着来,发现太屎,后来想到了一种神奇的方法——我们带着一个既有期望又有概率的矩阵,偶数(2*id)代表期望,奇数(2*id+1)代表概率,初始答案矩阵一列,1的位置为1(起点为0),工具 ...
- BZOJ 1444 [Jsoi2009]有趣的游戏 (AC自动机 + 概率DP + Gauss)
1444: [Jsoi2009]有趣的游戏 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1382 Solved: 498[Submit][Statu ...
- BZOJ2553 [BeiJing2011]禁忌 AC自动机 矩阵
原文链接http://www.cnblogs.com/zhouzhendong/p/8196279.html 题目传送门 - BZOJ2553 题意概括 引用一下lych大佬的: 在字母只有前alph ...
随机推荐
- 20165214 学习基础与C语言基础调查
读后感 我花时间仔细阅读了娄老师公众号上的那5篇关于自己各个方面学习经历的文章,随后深为震撼又自愧不如. 我实在没想到,这套学习方法竟有如此巨大的力量!纵使在娄老师不熟悉的乒乓球领域,娄老师也能通过这 ...
- shell脚本实例-跟踪网站日常变动
#!/usr/bin/bash #用途:跟踪网页是否有更新 if [ $# -ne 1 ];then echo -e "$Usage $0 URl " exit fi first_ ...
- Python 操作系统介绍 进程的创建
背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内 ...
- ubuntu 安装 mysql 的正确姿势
1.下载官方提供的mysql-apt-config.deb包进行APT源设置,下载地址:https://dev.mysql.com/downloads/repo/apt/ 2. // 将 mysql- ...
- 如何使用DAX函数解决动态图表标题
您可能知道,Power BI中的图表(以及许多其他可视化)具有可以设置为任何静态文本的标题.您可以通过选择图表,转到“可视化对象”窗格中的“格式”选项卡,然后更改“标题”部分中的属性(如下所示)来完成 ...
- php实现弱语言底层原理分析(转)
php中弱语言类型的底层实现 PHP是弱语言类型,主要分为三类: 1.标量类型:integer.string.float.boolean 2.复合类型:array.object 3.特殊类型:reso ...
- PHP设计模式之工厂模式(转)
概念 工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式. 使用工厂模式的好处是,如果你想要更改所实例化的类名等,则只需更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地 ...
- 【letcode】5-LongestPalindromicSubstring
回文串 回文串(palindromic string)是指这个字符串无论从左读还是从右读,所读的顺序是一样的:简而言之,回文串是左右对称的.一般求解一个字符串的最长回文子串问题. problem:Lo ...
- 百练6376-二维数组右上左下遍历-2015正式C题
C:二维数组右上左下遍历 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺 ...
- BZOJ4426 :最大生产率(贪心+决策单调性DP)
题意:给出N个人,现在让你分P组,每组的工作效率是最小结束时间-最大开始时间,要求每一组的效率的正数,求最大效率和.N<1000 思路: 把包含至少一个其他的分到A组:否则到B组. A组的要么单 ...