题面

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. ADO.NET学习(一)

    一.ADO.NET简介 ADO.NET可以看作是C#语言访问数据库的一种方式.编程语言编写的程序需要数据库的支持,那么怎样才能让他们建立连接呢?当然是ADO.NET 二.ADO.NET 整体流程 1) ...

  2. [.NET] 使用 Senparc.Weixin 接入微信公众号开发:简单实现自动回复

    使用 Senparc.Weixin 接入微信公众号开发:简单实现自动回复 目录 一.前提 二.基本配置信息简析 三.配置服务器地址(URL) 四.请求处理 一.前提 先申请微信公众号的授权,找到或配置 ...

  3. 折腾Java设计模式之单例模式

    博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...

  4. python 面试题

    1.os.path与sys.path的区别是什么? os.path 主要用于系统文件路径的操作 sys.path 主要是python解释器的系统环境参数的操作 2.re模块中match和search方 ...

  5. 洛谷P3366 【模板】最小生成树(Boruvka算法)

    题意 题目链接 Sol 自己yy着写了一下Boruvka算法. 算法思想很简单,就是每次贪心的用两个联通块之间最小的边去合并. 复杂度\(O(n \log n)\),然鹅没有Kruskal跑的快,但是 ...

  6. 安装Docker时错误提示 "could not change group /var/run/docker.sock to docker: group docker not found"的解决方案

    安装Dock服务,主要命令是  yum install docker. 但是在启动的时候报错:warning msg="could not change group /var/run/doc ...

  7. DataPipeline | 享物说产品负责人夏凯:数据驱动的用户增长实战

    夏凯 卡内基梅隆大学计算机系毕业,曾供职于Evernote数据团队和微软Bing.com搜索引擎广告部门.回国后作为早期成员加入小红书,先后从事大数据,用户增长,项目和团队管理等工作. 我最初是在美国 ...

  8. Storm入门-Storm与Spark对比

    作为一名程序员通病就是不安分,对业界的技术总要折腾一番,哪怕在最终实际工作中应用到的就那么一点.最近自己准备入门Storm学习,关于流式大数据框架目前比较流行的有Spark和Storm等,在入门之前, ...

  9. easyui实现分页

    主要参考官方的文档,欢迎评论 1.集成easyui,下面是我的引入方式,我引入到了head.html 每次只要引入该页面就可以了. <!-- easyui样式支持 --><link ...

  10. 《重构》的读书笔记–方法列表

    第5章 重构列表 5.1 重构的记录格式103 5.2 寻找引用点105 5.3 这些重构手法有多成熟106 第6章 重新组织函数 6.1 (P110)Extract Method(提炼函数) 6.2 ...