今天学校跳蚤市场摆摊聚众吸毒打call,东西卖了一百多好开心_(:з」∠)_

(然后大家中午就去吃了一顿好的x) 下午听演讲然后现在来填坑orz(其实是昨晚的坑)

题目:bzoj1444

先用字符串构造一个AC自动机,对于一个节点$k$来说,转移到$tr[k][i]$的概率是$p[i]$,根据概率构造出转移矩阵,如果一个点是模式串的结尾就自己给自己连一条1,发现一些点之间会相互影响,那么把转移矩阵乘几十次就可以了…

(这好像是个马尔科夫链的模型?

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std; const int N=105;
const int S=26;
struct matrix
{
double m[N][N];
matrix(){memset(m,0,sizeof(m));}
}; int n,m,l,cnt;
int tr[N][S+3],fail[N],pos[N];
bool danger[N];
double pro[S+3],p,q;
char s[N];
queue<int>Q; inline void insert(char *c,int p)
{
int len=strlen(c+1),k=0;
for(register int i=1;i<=len;i++)
{
int t=c[i]-'A';
if(!tr[k][t])tr[k][t]=++cnt;
k=tr[k][t];
}
danger[k]=1;pos[p]=k;
}
inline void build()
{
for(register int i=0;i<S;i++)if(tr[0][i])fail[tr[0][i]]=0,Q.push(tr[0][i]);
while(!Q.empty())
{
int k=Q.front();Q.pop();
for(register int i=0;i<S;i++)
{
if(!tr[k][i])tr[k][i]=tr[fail[k]][i];
else
{
fail[tr[k][i]]=tr[fail[k]][i];
Q.push(tr[k][i]);
}
}
}
}
inline matrix operator * (matrix a,matrix b)
{
matrix res;
for(register int i=0;i<N;i++)
for(register int j=0;j<N;j++)
for(register int k=0;k<N;k++)res.m[i][j]+=a.m[i][k]*b.m[k][j];
return res;
}
inline matrix pow(matrix a,int b)
{
matrix res;
for(register int i=0;i<N;i++)res.m[i][i]=1;
for(;b;b>>=1,a=a*a)if(b&1)res=res*a;
return res;
}
int main()
{
//freopen("input.in","r",stdin);
scanf("%d%d%d",&n,&l,&m);
for(register int i=0;i<m;i++)
{
scanf("%lf%lf",&p,&q);
pro[i]=p/q;
}
for(register int i=1;i<=n;i++)
{
scanf("%s",s+1);
insert(s,i);
}
build();
matrix res;
for(register int i=0;i<=cnt;i++)
{
if(danger[i])res.m[i][i]=1;
else
{
for(register int t=0;t<m;t++)res.m[i][tr[i][t]]+=pro[t];
}
} for(register int i=1;i<=100;i++)res=res*res;
for(register int i=1;i<=n;i++)printf("%.2lf\n",res.m[0][pos[i]]);
return 0;
}

[日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵的更多相关文章

  1. BZOJ1444:[JSOI2009]有趣的游戏(AC自动机,矩阵乘法)

    Description Input 注意 是0<=P, n , l, m≤ 10. Output Sample Input input 1 3 2 2 1 2 1 2 AB BA AA inpu ...

  2. bzoj1444[Jsoi2009]有趣的游戏[AC自动机]

    题面 bzoj 我要向师父学习善待每一只数据结构 考虑成环,那么高斯消元 然鹅这道题太小了 所以直接转移矩阵自乘就好啦 终点不向外连边 有一条向自己的,概率为一的自环来作为结尾 对于其他店 若有边\( ...

  3. 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 ...

  4. 【bzoj1444】[Jsoi2009]有趣的游戏 AC自动机+矩阵乘法

    题目描述 输入 注意 是0<=P 输出 样例输入 样例输出 题解 AC自动机+矩阵乘法 先将所有字符串放到AC自动机中,求出Trie图. 然后构建邻接矩阵:如果x不是某个字符串的末位置,则x连向 ...

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

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

  6. BZOJ 1444: [Jsoi2009]有趣的游戏 [AC自动机 高斯消元]

    1444: [Jsoi2009]有趣的游戏 题意:每种字母出现概率\(p_i\),有一些长度len的字符串,求他们出现的概率 套路DP的话,\(f[i][j]\) i个字符走到节点j的概率,建出转移矩 ...

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

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

  8. [BZOJ1444]有趣的游戏(AC自动机+矩阵乘法)

    n个等长字符串,机器会随机输出一个字符串(每个字母出现的概率为p[i]),问每个字符串第一个出现的概率是多少. 显然建出AC自动机,套路地f[i][j]表示i时刻位于节点j的概率. 构建转移矩阵,当i ...

  9. BZOJ 1444 有趣的游戏(AC自动机+矩阵快速幂)

    真的是很有趣的游戏... 对每个单词构建好AC自动机后,由于单词都是相同长度的且不同,所以不会出现互相为子串的形式. 那么我们对AC自动机上的节点构建转移矩阵.对于每个单词末尾的节点.该节点的出边仅仅 ...

随机推荐

  1. 深度分享:面试阿里,字节跳动,美团90%会被问到的HashMap知识

    一,HashTable 哈希表,它相比于hashMap结构简单点,它没有涉及红黑树,直接使用链表的方式解决哈希冲突. 我们看它的字段,和hashMap差不多,使用table存放元素 private t ...

  2. pip install 一个本地包时提示error: Microsoft Visual C++ 14.0 is required.

    错误如下: error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Too ...

  3. Android light系统分析

    光线系统包括:背光,闪光,led指示灯   一.内核层     Led-class.c (kernel-3.10\drivers\leds) 这个文件给HAL层提供接口     led_brightn ...

  4. Guitar Pro教程之虚拟吉他功能讲解

    上一章节我们讲述了Guitar Pro的组织小节的相关功能,那么本章节我们还是采用图文结合的方式为大家讲解关于{cms_selflink page='index' text='Guitar Pro'} ...

  5. Ubuntu无法telnet

    1.Ubuntu无法telnet的原因 (1)/etc/hosts被修改过 (2)防火墙没有关闭 (3)没有安装相关服务 (4)/etc/inetd.conf文件没有telnet相关内容 2.解决办法 ...

  6. 给集合null,filter结果空集合

  7. mq消息

    同步,异步,单向 Message的扩展属性主要包含下面几个: tag:消息tag,用于消息过滤 keys:Message索引键,用多个空格隔开,可以根据这些key快速检索到消息 waitStoreMs ...

  8. mybatis-plus使用记录

    如何and和or: QuoteSalaryEnum salaryMax = QuoteSalaryEnum.of(memberObjectInfo.getQuoteSalaryMax()); Quot ...

  9. 腾讯云linux系统部署项目无法通过外网访问

    最近尝试使用了一下腾讯去的linux系统服务器,但是却遇到各种问题,下面记录的问题是项目部署完成后却无法通过外网访问. 服务器:腾讯云 系统 :CentOS 8.0 64位 处理思路:通过度娘百般摸索 ...

  10. java顺序、选择、循环结构

    一.顺序结构 二.选择结构 1.if都执行 2.if else if else 条件满足才执行 3.选择结构switch 一个case后有多条语句要加花括号 多个case的值不能相同 case中要加b ...