bzoj1444[Jsoi2009]有趣的游戏[AC自动机]
题面
我要向师父学习善待每一只数据结构
考虑成环,那么高斯消元
然鹅这道题太小了 所以直接转移矩阵自乘就好啦
终点不向外连边 有一条向自己的,概率为一的自环来作为结尾
对于其他店 若有边\((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自动机]的更多相关文章
- [日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵
今天学校跳蚤市场摆摊聚众吸毒打call,东西卖了一百多好开心_(:з」∠)_ (然后大家中午就去吃了一顿好的x) 下午听演讲然后现在来填坑orz(其实是昨晚的坑) 题目:bzoj1444 先用字符串构 ...
- 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 ...
- 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 ...
- 【BZOJ1444】[Jsoi2009]有趣的游戏 AC自动机+概率DP+矩阵乘法
[BZOJ1444][Jsoi2009]有趣的游戏 Description Input 注意 是0<=P Output Sample Input Sample Output HINT 30%的 ...
- BZOJ 1444 [Jsoi2009]有趣的游戏 (AC自动机 + 概率DP + Gauss)
1444: [Jsoi2009]有趣的游戏 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1382 Solved: 498[Submit][Statu ...
- BZOJ 1444: [Jsoi2009]有趣的游戏 [AC自动机 高斯消元]
1444: [Jsoi2009]有趣的游戏 题意:每种字母出现概率\(p_i\),有一些长度len的字符串,求他们出现的概率 套路DP的话,\(f[i][j]\) i个字符走到节点j的概率,建出转移矩 ...
- 【bzoj1444】[Jsoi2009]有趣的游戏 AC自动机+矩阵乘法
题目描述 输入 注意 是0<=P 输出 样例输入 样例输出 题解 AC自动机+矩阵乘法 先将所有字符串放到AC自动机中,求出Trie图. 然后构建邻接矩阵:如果x不是某个字符串的末位置,则x连向 ...
- BZOJ 1444 [JSOI2009]有趣的游戏 (AC自动机、概率与期望DP、矩阵乘法)
诶这题洛谷居然没有??? 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1444 题解: 我见到主要有三种做法. 一是矩阵乘法.设\(d ...
- BZOJ 1444: [Jsoi2009]有趣的游戏 AC自动机+概率与期望+矩阵乘法
这道题还比较友好~首先,构建出来 $AC$ 自动机,那么我们要求的就是从 $0$ 号点走无限次走到一个终止节点的概率. 考虑构建转移矩阵 $M,$ $M_{i,j}$ 表示节点 $i$ 转移到节点 $ ...
随机推荐
- AspNetCore 多环境配置 以及注册 消费Consul
本文主要记录 CoreApi 的多环境配置以及如何消费在consul中注册的Api 服务 1.创建三个CoreApi 我们在项目中创建三个站点分别为 UserServices “用户服务”,Order ...
- cordova+vue打包webapp
使用cordova+vue打包webapp,可以快速给网页套上一个android和ios壳子,完成一个app的开发. 1. 环境准备. (1)node.js 下载地址: https://nodejs ...
- ASP.NET Core的JWT的实现(中间件).md
既然选择了远方,便只顾风雨兼程 __ HANS许 JWT(JSON Web Token) ASP.NET Core 的Middleware实现 引言:挺久没更新了,之前做了Vue的系列,后面想做做服务 ...
- PHP信号管理
PHP信号管理 SIGHUP 终止进程 终端线路挂断 SIGINT 终止进程 中断进程 SIGQUIT 建立CORE文件终止进程,并且生成core文件 SIG ...
- 面试常问的几个排序和查找算法,PHP实现
冒泡,快排,二分查找,都是面试常问的几个算法题目,虽然简单,但是一段时间不用的话就很容易忘记,这里我用PHP实现了一下,温故而知新. 排序 冒泡排序 每一次冒出一个最大的值 function bubb ...
- Canvas 绘图学习笔记2
1 绘制文本 fillText(string,x,y,maxWidth) //填充试绘制文本 strokeText(string,x,y,maxWidth) 画线试绘制文本 设置字体样式: cont ...
- 点击 Button触发事件将GridView1 CheckBox勾选的行添加到GridView2中
有时候想实现一个CheckBox选取功能,但是很多细节不是很清楚 相信大家都有遇到类似的情况,直接看代码,如下: 前端代码GridView1,CheckBox控件设置 <asp:GridView ...
- JQ表格隔行换色
<style type="text/css"> html, body { margin: 0; padding: 0; font-size: 15px; font-fa ...
- sql语句修改字段类型和增加字段
/*修改字段类型*/ ) go /*增加字段和说明*/ ) EXECUTE sp_addextendedproperty N'MS_Description','说明文字',N'user',N'dbo' ...
- SQL Server数据库————模糊查询和聚合函数
***********模糊查询*********/ 关键字: like (!!!!字符串类型) in (,,) 匹配()内的某个具体值(括号里可以写多个值) between... and.. 在某两 ...