1444: [Jsoi2009]有趣的游戏

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1800  Solved: 645
[Submit][Status][Discuss]

Description

Input

注意 是0<=P, n , l, m≤ 10.

Output

Sample Input

input 1
3 2 2
1 2
1 2
AB
BA
AA
input 2
3 4 2
1 2
1 2
AABA
ABAA
BAAA

Sample Output

output 1
0.25
0.50
0.25

output 2
0.31
0.33
0.37

HINT

 
 
    建个AC自动机之后,直接搞出转移的矩阵然后直接高斯消元即可。(既然是套路题我就不多说了2333)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define D double
const int maxn=205;
const D eps=1e-9;
int ch[maxn][27],n,m,l,cnt,X,Y;
int f[maxn],rot=0,dy[27];
D a[maxn][maxn],p[27];
char s[37];
bool islef[maxn]; inline int Id(char x){ return x-'A'+1;} inline void Ins(int x){
int now=rot;
for(int i=1,C;i<=l;i++){
C=Id(s[i]);
if(!ch[now][C]) ch[now][C]=++cnt;
now=ch[now][C];
} dy[x]=now,islef[now]=1;
} inline void getfail(){
queue<int> q;
for(int i=1;i<=m;i++) if(ch[rot][i]){ f[ch[rot][i]]=0,q.push(ch[rot][i]);}
int x,v; while(!q.empty()){
x=q.front(),q.pop();
for(int i=1;i<=m;i++){
v=ch[x][i];
if(!v){ ch[x][i]=ch[f[x]][i]; continue;} q.push(v);
f[v]=ch[f[x]][i];
}
}
} inline void build(){
a[0][cnt+1]=1;
for(int i=0;i<=cnt;i++){
a[i][i]=1;
if(!islef[i]) for(int j=1;j<=m;j++) a[ch[i][j]][i]-=p[j];
} /*
for(int i=0;i<=cnt;i++){
for(int j=0;j<=cnt+1;j++) printf("%.2lf ",a[i][j]);
puts("");
}
*/
} inline void xy(){
for(int i=0;i<=cnt;i++){
int tmp=i;
for(int j=i+1;j<=cnt;j++) if(a[j][i]>a[tmp][i]) tmp=j;
if(tmp>i) for(int k=cnt+1;k>=i;k--) swap(a[i][k],a[tmp][k]); for(int j=i+1;j<=cnt;j++) if(fabs(a[j][i])>eps){
D o=a[j][i]/a[i][i];
for(int k=cnt+1;k>=i;k--) a[j][k]-=a[i][k]*o;
}
} for(int i=cnt;i;i--){
for(int j=i+1;j<=cnt;j++) a[i][cnt+1]-=a[i][j]*a[j][cnt+1];
a[i][cnt+1]/=a[i][i];
}
} inline void solve(){
getfail();
build();
xy();
} int main(){
scanf("%d%d%d",&n,&l,&m);
for(int i=1;i<=m;i++) scanf("%d%d",&X,&Y),p[i]=X/(D)Y;
for(int i=1;i<=n;i++){
scanf("%s",s+1);
Ins(i);
} solve(); for(int i=1;i<=n;i++) printf("%.2lf\n",a[dy[i]][cnt+1]); return 0;
}

  

[JSOI2009] 有趣的游戏的更多相关文章

  1. BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)

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

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

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

  3. BZOJ 1444:[JSOI2009]有趣的游戏

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

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

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

  5. 【BZOJ1444】[JSOI2009]有趣的游戏(高斯消元,AC自动机)

    [BZOJ1444][JSOI2009]有趣的游戏(高斯消元,AC自动机) 题面 BZOJ 题解 先把\(AC\)自动机构建出来,最好构成\(Trie\)图.然后这样子显然是在一个有向图中有一堆概率的 ...

  6. 1444: [Jsoi2009]有趣的游戏

    1444: [Jsoi2009]有趣的游戏 链接 分析: 如果一个点回到0号点,那么会使0号点的概率增加,而0号点的概率本来是1,不能增加,所以这题用期望做. 设$x_i$表示经过i的期望次数,然后初 ...

  7. 【bzoj1444】[Jsoi2009]有趣的游戏

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

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

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

  9. luogu P6125 [JSOI2009]有趣的游戏

    LINK:有趣的游戏 直接说做法了.首先是 我是不会告诉你我看完题后不太会 摸了2h鱼后看题解 一直翻发现自己题目有些没读完整.. 题目中说了每个字符串长度相同 而我一直在思考AC自动机可能存在一些节 ...

随机推荐

  1. Wordpress 后台文章编辑区添加模板选择功能

    功能:后台编辑文章时,可以选择文章使用的模板,效果如下图: 操作步骤: <?php /** * Template Name: kbsingle full * Add by Ryan 3/18/2 ...

  2. (源)Post Material实现后期DitanceFog

    后期DitanceFog @Author: DaoZhang_XDZ@163.com @GameFrameWork: Base DZGameFrameWork [Branch GameClientFa ...

  3. virt-install command

    安装 virt-install --connect qemu:///system \ --virt-type=kvm \ --name windows2008 --ram --vcpus --arch ...

  4. jQuery选择器之id选择器

    页面的任何操作都需要节点的支撑,开发者如果快速高效的找到指定的节点也是前端开发中的一个重点.jQuery提供了一系列的选择器帮助开发者达到这一目的,让开发者可以更少的处理复杂选择过程与性能优化,更多专 ...

  5. 四、vue派发更新

    收集的目的就是为了当我们修改数据的时候,可以对相关的依赖派发更新,那么这一节我们来详细分析这个过程. setter 部分的逻辑: /** * Define a reactive property on ...

  6. Python字符串相关

    #字符串的相关操作 #基本操作 #+ 字符串连接操作 str1 = '来是come走是go' str2 = '点头yes摇头no' result = str1 + str2 print(result) ...

  7. hdu 1846 Brave Game (博弈)

    Brave Game Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. HDU - 5919 Sequence II

    题意: 给定长度为n的序列和q次询问.每次询问给出一个区间(L,R),求出区间内每个数第一次出现位置的中位数,强制在线. 题解: 用主席树从右向左的插入点.对于当前点i,如果a[i]出现过,则把原位置 ...

  9. POJ 3630 Phone List | Trie 树

    题目: 给定 n 个长度不超过 10 的数字串,问其中是否存在两个数字串 S, T ,使得 S 是 T 的前缀.多组数据,数据组数不超过 40. 题解: 前缀问题一般都用Trie树解决: 所以跑一个T ...

  10. xdebug使用教程

    http://www.cnblogs.com/xujian2016/p/5548921.html 配置信息 zend_extension="D:\phpStudy\php53n\ext\ph ...