题面

bzoj

我要向师父学习善待每一只数据结构

考虑成环,那么高斯消元

然鹅这道题太小了 所以直接转移矩阵自乘就好啦

终点不向外连边 有一条向自己的,概率为一的自环来作为结尾

对于其他店 若有边\((u -> v) = p\) 那么mat[u][v] += p


#include <cmath>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <complex>
#include <ctime>
#include <vector>
#include <queue>
#include <bitset>
#define mp(x, y) make_pair(x, y)
using namespace std;
const int N = 15;
const int M = 105;
int n, m, len, sz, en[N];
double p[N];
struct Matrix{
double w[M][M];
void clear(){
for(int i = 0; i <= sz; ++i)
for(int j = 0; j <= sz; ++j)
w[i][j] = 0;
}
void print(){
printf("--------------------\n");
for(int i = 0; i <= sz; ++i){
for(int j = 0; j <= sz; ++j)
printf("%.2lf ", w[i][j]);
printf("\n");
}
printf("--------------------\n");
}
friend Matrix operator *(const Matrix x, const Matrix y){
Matrix z; z.clear();
for(int i = 0; i <= sz; ++i)
for(int j = 0; j <= sz; ++j)
for(int k = 0; k <= sz; ++k)
z.w[i][j] += x.w[i][k] * y.w[k][j];
// z.print();
return z;
}
}mat, res;
struct AC{
int ch[M][N], f[M];
bool flag[M];
queue<int> que;
void ins(char* str, int id){
int now = 0;
for(int i = 1, cc; i <= len; ++i){
cc = str[i] - 'A';
if(!ch[now][cc]) ch[now][cc] = ++sz;
now = ch[now][cc];
}
en[id] = now, flag[now] = 1;
}
void build(){
int now = 0;
for(int i = 0; i < m; ++i) if(ch[0][i]) que.push(ch[0][i]);
while(!que.empty()){
int fro = que.front(); que.pop();
for(int i = 0; i < m; ++i){
if(ch[fro][i]) f[ch[fro][i]] = ch[f[fro]][i], que.push(ch[fro][i]);//!!
else ch[fro][i] = ch[f[fro]][i];
}
}
mat.clear();
for(int i = 0; i <= sz; ++i){
if(flag[i]){
mat.w[i][i] = 1; continue;
}
for(int j = 0; j < m; ++j){
mat.w[i][ch[i][j]] += p[j];
}
}
}
}ac; int main(){
scanf("%d%d%d", &n, &len, &m);
for(int i = 0; i < m; ++i){
double x, y; scanf("%lf%lf", &x, &y);
p[i] = x / y;
}
char str[N];
for(int i = 1; i <= n; ++i){
scanf("%s", str + 1);
ac.ins(str, i);
}
ac.build();
for(int i = 1; i <= 100; ++i) mat = mat * mat;
//转移矩阵自乘 得到来自0的解
for(int i = 1; i <= n; ++i) printf("%.2lf\n", mat.w[0][en[i]]);
return 0;
}

bzoj1444[Jsoi2009]有趣的游戏[AC自动机]的更多相关文章

  1. [日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵

    今天学校跳蚤市场摆摊聚众吸毒打call,东西卖了一百多好开心_(:з」∠)_ (然后大家中午就去吃了一顿好的x) 下午听演讲然后现在来填坑orz(其实是昨晚的坑) 题目:bzoj1444 先用字符串构 ...

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

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

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

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

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

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

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

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

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

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

  8. BZOJ 1444 [JSOI2009]有趣的游戏 (AC自动机、概率与期望DP、矩阵乘法)

    诶这题洛谷居然没有??? 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1444 题解: 我见到主要有三种做法. 一是矩阵乘法.设\(d ...

  9. BZOJ 1444: [Jsoi2009]有趣的游戏 AC自动机+概率与期望+矩阵乘法

    这道题还比较友好~首先,构建出来 $AC$ 自动机,那么我们要求的就是从 $0$ 号点走无限次走到一个终止节点的概率. 考虑构建转移矩阵 $M,$ $M_{i,j}$ 表示节点 $i$ 转移到节点 $ ...

随机推荐

  1. vue-resource实现数据的绑定、添加、删除

    vue-resource实现数据的绑定.添加.删除 <!DOCTYPE html> <html lang="en"> <head> <ti ...

  2. C#实现.ini文件读写操作

    1.ini文件是什么?        见百度百科:https://baike.baidu.com/item/ini%E6%96%87%E4%BB%B6/9718973?fr=aladdin 2.C#语 ...

  3. Java开发笔记(八十五)通过字符流读写文件

    前面介绍了文件的信息获取.管理操作,以及目录下的文件遍历,那么文件内部数据又是怎样读写的呢?这正是本文所要阐述的内容.File工具固然强大,但它并不能直接读写文件,而要借助于其它工具方能开展读写操作. ...

  4. 判断值是否为undefined

    可以使用 Ext.isDefined( value ) 这个函数, 也可以使用下面代码来进行实现: /** 判断传入的值是否 为undefined */ function isUndefined(va ...

  5. python datetime操作

    #datetime object转化为timestamp import datetime now = datetime.datetime.now() now_timestamp = time.mkti ...

  6. JavaScript jQuery 中定义数组操作及数组操作

    1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象 Javascript不支持多维数组,但是因为数组里面可以包含对象(数组也是一个对象),所以数组可以通过相互嵌套实现类似多维 ...

  7. 根据Webservice地址,动态传入参数(Webservice代理类)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sunlib; ...

  8. Docker(4):Docker集中化web界面管理平台—Shipyard部署

    //关闭防火墙 并禁止自启 [root@localhost ~]# systemctl stop firewalld [root@localhost ~]# systemctl disable fir ...

  9. 【转】Android Hook框架Xposed详解

    1 Introduction 1.1  概述 Xposed 是 GitHUB 上 rovo89 大大设计的一个针对 Android 平台的动态劫持项目,通过替换 /system/bin/app_pro ...

  10. UVA11419 SAM I AM

    UVA11419 SAM I AM 给定一个 \(R\times C\) 的矩阵中的 \(N\) 个点,求最少选取多少个行或列才能使得每个给出的点都被一行或一列覆盖,输出方案 \(R,\ C\leq1 ...