题面

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. java面试记录

    怎么确保一个集合不能被修改   ArrayList<String> list = new ArrayList<>();list.add("x");Colle ...

  2. 基于python的种子搜索网站-项目部署

    本讲会对种子搜索网站的部署过程进行详细的讲解. 网站演示: https://bt.mypython.me 源码地址: https://github.com/geeeeeeeek/bt 项目部署过程 系 ...

  3. SpringAOP术语

    2019-03-10/21:12:31 参考博客:MiroKlose AOP术语 1.通知: 通知定义了切面要完成的工作内容和何时完成工作,就是什么时候去做辅助功能,功能具体是什么代码 五种类型 Be ...

  4. mapfile中关于栅格数据的processing项说明

    mapfile是MapServer中地图的配置文件,规定了地图的源数据.投影.样式等一系列信息.用MapServer发布影像地图,需要用以下processing项设置地图的风格样式. BANDS=re ...

  5. redis -list

    列表的元素类型为string 按照插入顺序排序 增加: 例如: 从列表的 左侧 加入数据 a b c lpush 键 a b c 显示:1“c"2"b"3"c& ...

  6. netcore开发windows普通服务(非Web)并一键发布到服务器

    如何开发并一键发布WindowsService项目(netcore普通项目) netcore下开发windows服务如果是web项目的话,由于aspnetcore本身是支持的,把默认的host.Run ...

  7. 类Math

    概述 java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数.类似这样的工具 类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单. 常用方法 ​ ...

  8. 关于Net core 的https 设置小知识

    今天我是遇到了一个蛋疼的问题, 就是https 协议, 在创建项目的时候, 我勾选了for  https (如下图), 然后我就在startup.cs 和Kestrel 各种设置还是全部走https ...

  9. 03-MySQL表操作

    MySQL表操作 1.介绍 表就相当于文件,表中的一条记录就相当与文件的一行内容,不同的是,表中的一条记录有对应的标题,成为表的字段. 2.创建表 2.1语法 create table 表名( 字段名 ...

  10. STL—之迭代器,文中推荐的博客很给力

    在此,不再赘述迭代器本身的意义和作用,本质上,迭代器就是一种泛型指针.但是不同的容器对应的迭代器是不同的,我们使用迭代器的时候,需要认识到: 知道迭代器的类型是一件很重要的事情. 在此,给出一个描述迭 ...