http://acm.hdu.edu.cn/showproblem.php?pid=5955

题意:给你长度为l的n组数,每个数1-6,每次扔色子,问你每个串第一次被匹配的概率是多少

题解:先建成ac自动机构造fail数组,然后因为fail指针可能向前转移所以不能不能直接递推dp,需要高斯消元解方程,对于节点i,假设不是结束点而且能转移到它的点有a1,a2...an,那么dp[i]=1/6*dp[a1]+1/6*dp[a2]+...+1/6*a[n],然后我们可以列出n个方程,高斯消元然后找到每个串结尾点的概率就是答案了

  1. //#pragma comment(linker, "/stack:200000000")
  2. //#pragma GCC optimize("Ofast,no-stack-protector")
  3. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  4. //#pragma GCC optimize("unroll-loops")
  5. #include<bits/stdc++.h>
  6. #define fi first
  7. #define se second
  8. #define mp make_pair
  9. #define pb push_back
  10. #define pi acos(-1.0)
  11. #define ll long long
  12. #define vi vector<int>
  13. #define mod 1000000007
  14. #define C 0.5772156649
  15. #define ls l,m,rt<<1
  16. #define rs m+1,r,rt<<1|1
  17. #define pil pair<int,ll>
  18. #define pli pair<ll,int>
  19. #define pii pair<int,int>
  20. #define cd complex<double>
  21. #define ull unsigned long long
  22. #define base 1000000000000000000
  23. #define fio ios::sync_with_stdio(false);cin.tie(0)
  24.  
  25. using namespace std;
  26.  
  27. const double g=10.0,eps=1e-;
  28. const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;
  29.  
  30. int l;
  31. double a[N][N],ans[N];
  32. void gauss(int n)
  33. {
  34. for(int i=;i<n;i++)
  35. {
  36. if(a[i][i]==)
  37. {
  38. int id=;
  39. for(int j=i+;j<=n;j++)
  40. if(a[j][i]!=)
  41. id=j;
  42. for(int j=i;j<=n+;j++)
  43. swap(a[i][j],a[id][j]);
  44. }
  45. for(int j=i+;j<=n;j++)
  46. {
  47. double t=a[j][i]/a[i][i];
  48. for(int k=i;k<=n+;k++)
  49. a[j][k]-=(a[i][k]*t);
  50. }
  51. }
  52. // for(int i=1;i<=n;i++)
  53. // {
  54. // for(int j=1;j<=n+1;j++)
  55. // printf("%.12f ",a[i][j]);
  56. // puts("");
  57. // }
  58. for(int i=n;i>=;i--)
  59. {
  60. for(int j=i+;j<=n;j++)
  61. a[i][n+]-=ans[j]*a[i][j];
  62. ans[i]=a[i][n+]/a[i][i];
  63. }
  64. }
  65. char s[N];
  66. struct ACM{
  67. int root,tot;
  68. int Next[N][],fail[N],End[N];
  69. int newnode()
  70. {
  71. memset(Next[tot],-,sizeof Next[tot]);
  72. End[tot]=;
  73. return tot++;
  74. }
  75. void init()
  76. {
  77. tot=;
  78. root=newnode();
  79. }
  80. void ins(int i)
  81. {
  82. int now=root;
  83. for(int i=,x;i<l;i++)
  84. {
  85. scanf("%d",&x);x--;
  86. if(Next[now][x]==-)
  87. Next[now][x]=newnode();
  88. now=Next[now][x];
  89. }
  90. End[now]=i;
  91. }
  92. void build()
  93. {
  94. queue<int>q;
  95. fail[root]=root;
  96. for(int i=;i<;i++)
  97. {
  98. if(Next[root][i]==-)Next[root][i]=root;
  99. else
  100. {
  101. fail[Next[root][i]]=root;
  102. q.push(Next[root][i]);
  103. }
  104. }
  105. while(!q.empty())
  106. {
  107. int now=q.front();
  108. q.pop();
  109. if(End[fail[now]])End[now]=End[fail[now]];
  110. for(int i=;i<;i++)
  111. {
  112. if(Next[now][i]==-)Next[now][i]=Next[fail[now]][i];
  113. else
  114. {
  115. fail[Next[now][i]]=Next[fail[now]][i];
  116. q.push(Next[now][i]);
  117. }
  118. }
  119. }
  120. }
  121. void solve()
  122. {
  123. memset(a,,sizeof a);
  124. a[][tot+]=-1.0;
  125. for(int i=;i<tot;i++)
  126. {
  127. a[i+][i+]=-1.0;
  128. if(End[i])continue;
  129. for(int j=;j<;j++)a[Next[i][j]+][i+]+=1.0/;
  130. }
  131. // for(int i=1;i<=tot;i++)
  132. // {
  133. // for(int j=1;j<=tot+1;j++)printf("%.5f ",a[i][j]);
  134. // puts("");
  135. // }
  136. gauss(tot);
  137. bool ok=;
  138. for(int i=;i<tot;i++)
  139. {
  140. if(End[i])
  141. {
  142. if(!ok)printf("%.6f",ans[i+]);
  143. else printf(" %.6f",ans[i+]);
  144. ok=;
  145. }
  146. }
  147. puts("");
  148. }
  149. }ac;
  150. int main()
  151. {
  152. int T;scanf("%d",&T);
  153. while(T--)
  154. {
  155. ac.init();
  156. int n;
  157. scanf("%d%d",&n,&l);
  158. for(int i=;i<n;i++)ac.ins(i+);
  159. ac.build();
  160. ac.solve();
  161. }
  162. return ;
  163. }
  164. /***********************
  165. 1
  166. 2 2
  167. 1 1
  168. 2 1
  169. ***********************/

2016ACM/ICPC亚洲区沈阳站H - Guessing the Dice Roll HDU - 5955 ac自动机+概率dp+高斯消元的更多相关文章

  1. HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  2. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  3. HDU 5948 Thickest Burger 【模拟】 (2016ACM/ICPC亚洲区沈阳站)

    Thickest Burger Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  4. HDU 5949 Relative atomic mass 【模拟】 (2016ACM/ICPC亚洲区沈阳站)

    Relative atomic mass Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  5. hdu5955 Guessing the Dice Roll【AC自动机】【高斯消元】【概率】

    含高斯消元模板 2016沈阳区域赛http://acm.hdu.edu.cn/showproblem.php?pid=5955 Guessing the Dice Roll Time Limit: 2 ...

  6. 2016ACM/ICPC亚洲区沈阳站 - A/B/C/E/G/H/I - (Undone)

    链接:传送门 A - Thickest Burger - [签到水题] ACM ICPC is launching a thick burger. The thickness (or the heig ...

  7. 2016ACM/ICPC亚洲区沈阳站-重现赛

    C.Recursive sequence 求ans(x),ans(1)=a,ans(2)=b,ans(n)=ans(n-2)*2+ans(n-1)+n^4 如果直接就去解...很难,毕竟不是那种可以直 ...

  8. 2016ACM/ICPC亚洲区沈阳站 Solution

    A - Thickest Burger 水. #include <bits/stdc++.h> using namespace std; int t; int a, b; int main ...

  9. 2016ACM/ICPC亚洲区沈阳站-重现赛赛题

    今天做的沈阳站重现赛,自己还是太水,只做出两道签到题,另外两道看懂题意了,但是也没能做出来. 1. Thickest Burger Time Limit: 2000/1000 MS (Java/Oth ...

随机推荐

  1. keeplived + mysql双主复制部署 --原创

    环境: master 1: 192.168.100.10  oracle  linux 7.4  mysql 5.7.1 master 2: 192.168.100.11 oracle  linux ...

  2. vim高亮显示文本

    行列高亮设置 • 行高亮 " 设置高亮行的颜色,ctermbg设定背景色,ctermfg设定前景色 set cursorline hi CursorLine cterm=NONE cterm ...

  3. Mac下 Visual VM 无法检测到本地的Java进程

    我下载的是VisualVM1.4 下载完成之后,在左边栏Local哪里只有VisualVM自己的进程. 我本地启动的eclipse和intelliJ都没有检测到. 网上查阅后都是Window下的解决方 ...

  4. AtCoder Regular Contest 080 C - 4-adjacent

    地址:http://arc080.contest.atcoder.jp/tasks/arc080_a 题目: C - 4-adjacent Time limit : 2sec / Memory lim ...

  5. RPC细节

    服务化有什么好处? 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图所示: 服务A:欧洲团队维护,技术背景是Java 服务B:美洲团队维护,用C++实现 ...

  6. iOS 动态调用方法

      - (void)bugly { dispatch_async(dispatch_get_global_queue(0, 0), ^{ if (NSClassFromString(@"Bu ...

  7. Windows MFC控件消息编程

    1. Progress Bar Control Messages    PBM_DELTAPOS    PBM_GETPOS    PBM_GETRANGE    PBM_SETBARCOLOR    ...

  8. GZFramework错误(升级修改)日志

    sqlserver下事务中处理出现为初始化selectcommand的connection属性修改CommandDataBase中的PrepareCommand方法

  9. 【Thinking in Java, 4e】访问权限控制

    [包:库单元] 编译单元的概念. 一个.java文件就是一个编译单元,一个编译单元只能有一个public类,编译单元中的非public类一般是用于为public类提供支持的,这些类在包外不可见. im ...

  10. Java-GC垃圾收集器

    1. Serial young generation “单线程”收集器,是指进行垃圾收集时,必须暂停其他所有工作线程,直到收集结束.是历史最悠久的收集器. 2. Serial Old tenured ...