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

时间:2021-05-25 23:11:48

1444: [Jsoi2009]有趣的游戏

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1382  Solved: 498
[Submit][Status][Discuss]

Description

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

Input

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

注意 是0<=P

Output

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

Sample Input

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

Sample Output

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

HINT

BZOJ 1444 [Jsoi2009]有趣的游戏 (AC自动机 + 概率DP + Gauss) 30%的数据保证, n ≤ 2. 50%的数据保证, n ≤ 5. 100%的数据保证, n , l, m≤ 10.

Source

析:很容易列出方程,dp[i] = ∑dp[j] * pj ,所以要处理出来就需要AC自动机,然后再用Gauss 消元即可。

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#include <sstream>
#include <list>
#include <assert.h>
#include <bitset>
#include <numeric>
#define debug() puts("++++")
#define gcd(a, b) __gcd(a, b)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define fi first
#define se second
#define pb push_back
#define sqr(x) ((x)*(x))
#define ms(a,b) memset(a, b, sizeof a)
//#define sz size()
#define pu push_up
#define pd push_down
#define cl clear()
#define all 1,n,1
#define FOR(i,x,n) for(int i = (x); i < (n); ++i)
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std; typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const LL LNF = 1e17;
const double inf = 1e20;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 150000 + 10;
const int maxm = 3e5 + 10;
const int mod = 10007;
const int dr[] = {-1, 0, 1, 0};
const int dc[] = {0, -1, 0, 1};
const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline bool is_in(int r, int c) {
return r >= 0 && r < n && c >= 0 && c < m;
}
const int maxnode = 10 * 10 + 50;
int sigma;
double A[maxnode][maxnode];
double p[15];
int pos[15]; struct Aho{
int ch[maxnode][11], f[maxnode];
bool val[maxnode];
int sz; void init(){ sz = 1; ms(ch[0], 0); }
inline int idx(char ch){ return ch - 'A'; } int insert(const char *s){
int u = 0;
for(int i = 0; s[i]; ++i){
int c = idx(s[i]);
if(!ch[u][c]){
ms(ch[sz], 0);
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] = 1;
return u;
} void getFail(){
queue<int> q; f[0] = 0;
for(int c = 0; c < sigma; ++c){
int u = ch[0][c];
if(u){ q.push(u); f[u] = 0; }
} while(!q.empty()){
int r = q.front(); q.pop();
for(int c = 0; c < sigma; ++c){
int u = ch[r][c];
if(!u){ ch[r][c] = ch[f[r]][c]; continue; }
q.push(u);
int v = f[r];
while(v && !ch[v][c]) v = f[v];
f[u] = ch[v][c];
}
}
} int solve(){
for(int i = 0; i < sz; ++i){
A[i][i] += 1.;
if(val[i]) continue;
for(int j = 0; j < sigma; ++j){
int nxt = ch[i][j];
A[nxt][i] -= p[j];
}
}
return sz;
}
};
Aho aho;
char s[20]; void Gauss(int n){
for(int i = 0; i < n; ++i){
int r = i;
for(int j = i+1; j < n; ++j)
if(fabs(A[j][i] > fabs(A[r][i]))) r = j;
if(r != i) for(int j = 0; j <= n; ++j) swap(A[r][j], A[i][j]); for(int k = i+1; k < n; ++k){
double f = A[k][i] / A[i][i];
for(int j = i; j <= n; ++j) A[k][j] -= f * A[i][j];
}
}
for(int i = n-1; i >= 0; --i){
for(int j = i+1; j < n; ++j)
A[i][n] -= A[j][n] * A[i][j];
A[i][n] /= A[i][i];
}
} int main(){
scanf("%d %d %d", &n, &m, &sigma);
for(int i = 0; i < sigma; ++i){
int x, y; scanf("%d %d", &x, &y);
p[i] = x * 1. / y;
}
aho.init();
for(int i = 1; i <= n; ++i){
scanf("%s", s);
pos[i] = aho.insert(s);
}
aho.getFail();
int len = aho.solve();
A[0][len] = 1.;
Gauss(len);
for(int i = 1; i <= n; ++i) printf("%.2f\n", A[pos[i]][len] / A[pos[i]][pos[i]]);
return 0;
}

  

BZOJ 1444 [Jsoi2009]有趣的游戏 (AC自动机 + 概率DP + Gauss)的更多相关文章

  1. BZOJ 1444&colon; &lbrack;Jsoi2009&rsqb;有趣的游戏 AC自动机&plus;概率与期望&plus;矩阵乘法

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

  2. BZOJ 1444&colon; &lbrack;Jsoi2009&rsqb;有趣的游戏 &lbrack;AC自动机 高斯消元&rsqb;

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

  3. 【BZOJ1444】&lbrack;Jsoi2009&rsqb;有趣的游戏 AC自动机&plus;概率DP&plus;矩阵乘法

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

  4. BZOJ 1444 &lbrack;JSOI2009&rsqb;有趣的游戏 &lpar;AC自动机、概率与期望DP、矩阵乘法&rpar;

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

  5. BZOJ1444&lbrack;Jsoi2009&rsqb;有趣的游戏——AC自动机&plus;概率DP&plus;矩阵乘法

    题目描述 输入 注意 是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 ...

  6. BZOJ 1444&colon;&lbrack;JSOI2009&rsqb;有趣的游戏

    BZOJ 1444:[JSOI2009]有趣的游戏 题目链接 首先我们建出Trie图,然后高斯消元. 我们设\(f_i\)表示经过第\(i\)个点的期望次数: \[ f_x=\sum i\cdot p ...

  7. BZOJ&colon;4820&colon; &lbrack;Sdoi2017&rsqb;硬币游戏&amp&semi;&amp&semi;BZOJ&colon;1444&colon; &lbrack;Jsoi2009&rsqb;有趣的游戏(高斯消元求概率)

    1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...

  8. bzoj 1444&colon; &lbrack;Jsoi2009&rsqb;有趣的游戏【AC自动机&plus;dp&plus;高斯消元】

    https://blog.sengxian.com/solutions/bzoj-1444 orz 一直是我想错了,建出AC自动机之后,实际上这个定义是设f[i]为经过i节点的 * 期望次数 * ,因 ...

  9. BZOJ 1444 &lbrack;JSOI2009&rsqb;有趣的游戏 &lpar;Trie图&sol;AC自动机&plus;矩阵求逆&rpar;

    题目大意:给你$N$个长度相等且互不相同的模式串,现在有一个字符串生成器会不断生成字符,其中每个字符出现的概率是$p_{i}/q_{i}$,当生成器生成的字符串包含了某个模式串,则拥有该模式串的玩家胜 ...

随机推荐

  1. macosx 10&period;11 python pip install 出现错误OSError&colon; &lbrack;Errno 1&rsqb; Operation not permitted&colon;

    Exception: Traceback (most recent call last): File , in main status = self.run(options, args) File , ...

  2. 通过StoryBoard加载视图控制器问题

    如果通过拉线的方式拉进来一个UIViewController,再将它绑定一个UIViewController类.创建的时候通过alloc,init创建出来并不会创建出一个你拉进来的UIViewCont ...

  3. Jetty直接调试,不用部署,不用弄一些杂七杂八的设置

    以前调试web程序的,搭建Tomcat实在是费劲,就想找一个比较简单的方式,我就想调试一下我写的某一个servlet形式,看到<how Tomcat works>这本书,才明白确实可以,不 ...

  4. UVA 11774 - Doom&amp&semi;&num;39&semi;s Day&lpar;规律&rpar;

    UVA 11774 - Doom's Day 题目链接 题意:给定一个3^n*3^m的矩阵,要求每次按行优先取出,按列优先放回,问几次能回复原状 思路:没想到怎么推理,找规律答案是(n + m) / ...

  5. CodeForces 710C Magic Odd Square

    构造. 先只考虑用$0$和$1$构造矩阵. $n=1$,$\left[ 1 \right]$. $n=3$,(在$n=1$的基础上,最外一圈依次标上$0$,$1$,$0$,$1$......) $\l ...

  6. Tomcat线程数与处理速度的关系

    问题:Tomcat线程数是不是越大越好呢? 答案肯定是否定的. Tomcat的处理速度跟线程数不是完全成正比的,设置不恰当会出现相反的效果.服务的负载计算包括了CPU的使用率和资源等待. 第一种情况, ...

  7. web调试-禁止&sol;清空chrome页面缓存

    Chrome会对页面缓存,web页面调试的时候,后端修改页面.js之后,刷新页面经常不生效,非常不方便. 有一些小技巧可以解决该问题. 技巧一: 开发者工具-setting/设置,可以关闭缓存. 开发 ...

  8. jquery里判断数组内是否包含了指定的值或元素的方法

    本文讲的是在jquery里,如何判断一个数组里是否包含了指定的值,变量,或其它对象元素的方法. 在jquery里,我们可以用$.inArray来判断一个数组里是否包含了指定的值或其它对象元素,来看一个 ...

  9. 【转】OSI详解

    本文转自牛客网友CZ❤♡ღQM对在ISO/OSI参考模型中,网络层的主要功能是一题的回答. OSI ( Open System Interconnect ),即开放式系统互联. 一般都叫 OSI 参考 ...

  10. stl之std&colon;&colon;remove&lowbar;copy

    template <class InputIterator, class OutputIterator, class T> OutputIterator remove_copy (Inpu ...