题意:http://www.lydsy.com/JudgeOnline/problem.php?id=2553

sol  :puts("nan"); (逃~

   ac自动机+矩阵快速幂

   先将所有的串放到ac自动机上,贪心匹配,对一个包含禁忌串的节点划分出一段

   设f[i][j]表示走了i步到达AC自动机上的j节点的概率

   转移方程为f[i+1][k]=f[i][j]/alphabet

   由于i较大,但是每一步的转移是一样的,所以可以用矩阵快速幂优化

   P.S.喜sang闻xin乐bing见kuang的出题人卡精度QAQ,需要开long double

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int Mx=;
struct Node { int l,r; long double f[Mx][Mx]; } str,final;
int n,m,cnt,len,num,ch[Mx][],fail[Mx],q[Mx],jud[Mx];
char s[Mx];
void build_trie()
{
int x=;
for(int i=;i<=m;i++)
{
if(!ch[x][s[i]-'a']) ch[x][s[i]-'a']=++cnt;
x=ch[x][s[i]-'a'];
if(jud[x]) break;
}
jud[x]=;
}
void get_fail()
{
int h=,t=;q[h]=;
while(h!=t)
{
int now=q[h++]; if(h>Mx) h=;
for(int i=;i<num;i++)
if(ch[now][i])
{
int x=ch[now][i],y=fail[now];
while(y&&(!ch[y][i])) y=fail[y];
if(ch[y][i]!=x) fail[x]=ch[y][i];
else fail[x]=;
q[t++]=x; if(t>Mx) t=;
}
else ch[now][i]=ch[fail[now]][i];
}
str.f[cnt+][cnt+]=;
}
Node mul(Node x,Node y)
{
Node tmp;tmp.l=x.l;tmp.r=y.r;
memset(tmp.f,,sizeof(tmp.f));
for(int k=;k<x.r;k++)
for(int i=;i<x.l;i++)
for(int j=;j<y.r;j++)
tmp.f[i][j]+=x.f[i][k]*y.f[k][j];
return tmp;
}
void build()
{
get_fail();
long double tmp=(long double) /num;
for(int i=;i<=cnt;i++)
if(!jud[i])
for(int j=;j<num;j++)
if(jud[ch[i][j]]) str.f[i][cnt+]+=tmp,str.f[i][]+=tmp;
else str.f[i][ch[i][j]]+=tmp;
str.f[cnt+][cnt+]=;
}
void dfs(int x)
{
if(jud[x])
for(int i=;i<num;i++) ch[x][i]=;
else
for(int i=;i<num;i++)
if(ch[x][i]) dfs(ch[x][i]);
}
void pre()
{
scanf("%d%d%d",&n,&len,&num);
for (int i=;i<=n;i++)
{
scanf("%s",s+); m=strlen(s+);
build_trie();
}
dfs();
str.l=str.r=cnt+;
final.l=,final.r=cnt+,final.f[][]=;
}
int main()
{
pre();
build();
for( ;len;len>>=,str=mul(str,str)) if(len&) final=mul(final,str);
printf("%.9lf",(double) final.f[][cnt+]);
}

bzoj2553【beijing2011】禁忌的更多相关文章

  1. BZOJ2553: [BeiJing2011]禁忌

    2553: [BeiJing2011]禁忌 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 203  Solved: ...

  2. [BZOJ2553][BeiJing2011]禁忌 dp+AC自动机+矩阵快速幂

    2553: [BeiJing2011]禁忌 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1206  Solved ...

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

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

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

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

  5. BZOJ2553 Beijing2011禁忌(AC自动机+动态规划+矩阵快速幂+概率期望)

    考虑对一个串如何分割能取得最大值.那么这是一个经典的线段覆盖问题,显然每次取右端点尽量靠前的串.于是可以把串放在AC自动机上跑,找到一个合法串后就记录并跳到根. 然后考虑dp.设f[i][j]表示前i ...

  6. BZOJ2553 [BeiJing2011]禁忌 【AC自动机 + dp + 矩乘优化】

    题目链接 BZOJ2553 题解 话说在前,此题卡精度,最好开long double 先建\(AC\)自动机 求期望,逆着求,设\(f[i][j]\)为长度为\(i\)的串,当前匹配AC自动机\(j\ ...

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

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

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

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

  9. 【bzoj2553】[BeiJing2011]禁忌

    2553: [BeiJing2011]禁忌 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 595  Solved: ...

  10. bzoj 2553 [BeiJing2011]禁忌——AC自动机+概率DP+矩阵

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2553 看了题解才会…… 首先,给定一个串,最好的划分方式是按禁忌串出现的右端点排序,遇到能填 ...

随机推荐

  1. python_31_集合

    # 集合是一个无序的,不重复的数据组合,它的主要作用如下: # 去重,把一个列表变成集合,就自动去重了 # 关系测试,测试两组数据之前的交集.差集.并集等关系 s = set([3, 5, 9, 10 ...

  2. python_27_多级字典嵌套及操作

    #key-value 字典无下标 所以乱序,key值尽量不要取中文 person_log={ '大二':{ 'Ya Nan':['free','cute','soso'], 'Sha sha':['微 ...

  3. Scanner和 Random类,控制语句的例题,商品管理(直接赋值)

    Scanner类的使用: import java.util.Scanner; class Demo02 { public static void main(String[] args) { //1.导 ...

  4. java基础面试题:try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

    package com.swift; public class Try_Catch_Finally_Test { public static void main(String[] args) { /* ...

  5. 网络流_spfa最小费用最大流

    最大流: 不断搜索增广路,寻找最小的容量-流量,得到最大流量,但最大流量在有花费时不一定是最小花费. 最小费用最大流 算法思想: 采用贪心的思想,每次找到一条从源点到达汇点的花费最小的路径,增加流量, ...

  6. 整理好的一些mysql表详细操作

    一.创建表的完整语法#语法:create table 库名.表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件]);约束条件:是 ...

  7. 将Web项目War包部署到Tomcat服务器基本步骤(完整版)

    1. 常识:   1.1 War包 War包一般是在进行Web开发时,通常是一个网站Project下的所有源码的集合,里面包含前台HTML/CSS/JS的代码,也包含Java的代码. 当开发人员在自己 ...

  8. 将Excel文件转为csv文件的python脚本

    #!/usr/bin/env python __author__ = "lrtao2010" ''' Excel文件转csv文件脚本 需要将该脚本直接放到要转换的Excel文件同级 ...

  9. Neon Lights in Hong Kong【香港霓虹灯】

    Neon Lights in Hong Kong Neon is to Hong Kong as red phone booths are to London and fog is to San Fr ...

  10. BFS:Nightmare(可返回路径)

    解题心得: 1.point:关于可以返回路径的BFS的标记方法,并非是简单的0-1,而是可以用时间比较之后判断是否push. 2.queue创建的地点(初始化问题),在全局中创建queue在一次调用B ...