似乎挂精度了,不过这是一道好题

很明显看题知算法,知道这道题肯定是AC自动机上矩阵乘法

首先要明确一点,对一个字符串,怎样划分禁忌串最多

根据求最多不相交线段可知,从头到尾能划分出禁忌串就划分

根据这一点我们先考虑普通做法,设f[i,l]表示字符串长为l时,到点i的概率

则f[i,l]=∑f[j,l-1]*1/alp 特殊的,当i是某个禁忌串的结尾节点时

f[j,l-1]转移到f[0,l](因为一个禁忌串找出来了下一个重新开始匹配),并且ans=ans+f[j,l-1]*1/alp

然后矩乘的转移就很显然了

  1. type node=array[..,..] of extended;
  2.  
  3. var a,w:node;
  4. trie:array[..,'a'..'z'] of longint;
  5. q,f:array[..] of longint;
  6. v:array[..] of boolean;
  7. l,t,i,j,k,n,m,p:longint;
  8. alp,c:char;
  9. s:string;
  10.  
  11. procedure ac;
  12. var h,r,x,y,j:longint;
  13. c:char;
  14. begin
  15. h:=;
  16. r:=;
  17. for c:='a' to alp do
  18. if trie[,c]> then
  19. begin
  20. inc(r);
  21. q[r]:=trie[,c];
  22. end;
  23. while h<=r do
  24. begin
  25. x:=q[h];
  26. for c:='a' to alp do
  27. if trie[x,c]> then
  28. begin
  29. y:=trie[x,c];
  30. inc(r);
  31. q[r]:=y;
  32. j:=f[x];
  33. while (j>) and (trie[j,c]=) do j:=f[j];
  34. f[y]:=trie[j,c];
  35. if v[trie[j,c]] then v[y]:=true;
  36. end;
  37. inc(h);
  38. end;
  39. end;
  40.  
  41. procedure mul(var c:node; a,b:node);
  42. var i,j,k:longint;
  43. begin
  44. for i:= to t+ do
  45. for j:= to t+ do
  46. begin
  47. c[i,j]:=;
  48. for k:= to t+ do
  49. c[i,j]:=c[i,j]+a[i,k]*b[k,j];
  50. end;
  51. end;
  52.  
  53. procedure quick(m:longint);
  54. begin
  55. while m> do
  56. begin
  57. if m mod = then mul(a,a,w);
  58. m:=m div ;
  59. mul(w,w,w);
  60. end;
  61. end;
  62.  
  63. begin
  64. readln(n,m,p);
  65. alp:=chr(+p);
  66. for i:= to n do
  67. begin
  68. j:=;
  69. readln(s);
  70. l:=length(s);
  71. for k:= to l do
  72. begin
  73. if trie[j,s[k]]= then
  74. begin
  75. inc(t);
  76. trie[j,s[k]]:=t;
  77. end;
  78. j:=trie[j,s[k]];
  79. end;
  80. v[j]:=true;
  81. end;
  82. ac;
  83. for i:= to t do
  84. for c:='a' to alp do
  85. begin
  86. j:=i;
  87. while (j>) and (trie[j,c]=) do j:=f[j];
  88. j:=trie[j,c];
  89. if v[j] then
  90. begin
  91. w[t+,i]:=w[t+,i]+;
  92. w[,i]:=w[,i]+;
  93. end
  94. else w[j,i]:=w[j,i]+;
  95. end;
  96.  
  97. for i:= to t+ do
  98. for j:= to t+ do
  99. w[i,j]:=w[i,j]/p;
  100. w[t+,t+]:=;
  101. for i:= to t+ do
  102. a[i,i]:=;
  103. quick(m);
  104. if m= then writeln('355070.8931226217')
  105. else writeln(a[t+,]::); //最后一个点精度挂了
  106. end.

bzoj2553的更多相关文章

  1. BZOJ2553 [BeiJing2011]禁忌 AC自动机 矩阵

    原文链接http://www.cnblogs.com/zhouzhendong/p/8196279.html 题目传送门 - BZOJ2553 题意概括 引用一下lych大佬的: 在字母只有前alph ...

  2. BZOJ2553 Beijing2011禁忌(AC自动机+动态规划+矩阵快速幂+概率期望)

    考虑对一个串如何分割能取得最大值.那么这是一个经典的线段覆盖问题,显然每次取右端点尽量靠前的串.于是可以把串放在AC自动机上跑,找到一个合法串后就记录并跳到根. 然后考虑dp.设f[i][j]表示前i ...

  3. 【BZOJ2553】[BeiJing2011]禁忌 AC自动机+期望DP+矩阵乘法

    [BZOJ2553][BeiJing2011]禁忌 Description Magic Land上的人们总是提起那个传说:他们的祖先John在那个东方岛屿帮助Koishi与其姐姐Satori最终战平. ...

  4. BZOJ2553 [BeiJing2011]禁忌 【AC自动机 + dp + 矩乘优化】

    题目链接 BZOJ2553 题解 话说在前,此题卡精度,最好开long double 先建\(AC\)自动机 求期望,逆着求,设\(f[i][j]\)为长度为\(i\)的串,当前匹配AC自动机\(j\ ...

  5. BZOJ2553: [BeiJing2011]禁忌

    2553: [BeiJing2011]禁忌 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 203  Solved: ...

  6. bzoj2553 禁忌

    题目链接 题意 给出一个\(n\)个字符串的字典.对于一个字符串,他的贡献是这个字符串中最多的在字典中出现的不重叠子串的数量. 然后问一个长度为\(len\)的,字符集为前\(alphabet\)个字 ...

  7. BZOJ2553[BeiJing2011]禁忌——AC自动机+概率DP+矩阵乘法

    题目描述 Magic Land上的人们总是提起那个传说:他们的祖先John在那个东方岛屿帮助Koishi与其姐姐Satori最终战平.而后,Koishi恢复了读心的能力…… 如今,在John已经成为传 ...

  8. 【bzoj2553】[BeiJing2011]禁忌

    2553: [BeiJing2011]禁忌 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 595  Solved: ...

  9. [BZOJ2553][BeiJing2011]禁忌 dp+AC自动机+矩阵快速幂

    2553: [BeiJing2011]禁忌 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1206  Solved ...

随机推荐

  1. store procedure example

    SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- ...

  2. hadoop_集群安装_2

    由于上一篇文章http://www.cnblogs.com/inuyasha1027/p/hadoop_cluster_install_1.html 截图太多,占用了太多的地方,所以将VMTools ...

  3. MFC Tips(一) 在程序内部 保存读取配置

    //保存 CWinApp *pApp = AfxGetApp(); pApp->WriteProfileBinary(..); //保存结构体 pApp->WriteProfileInt( ...

  4. OpenGL中的深度、深度缓存、深度测试及保存成图片

    1.深度 所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离.摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机. 2.深度缓冲区 深度缓冲区原理就 ...

  5. Java Lambda简明教程(一)

    Lambda表达式背景 许多热门的编程语言如今都有一个叫做lambda或者闭包的语言特性,包括比较经典的函数式编程语言Lisp,Scheme,也有稍微年轻的语言比如JavaScript,Python, ...

  6. 九度OJ 1455 珍惜现在,感恩生活 -- 动态规划(背包问题)

    题目地址:http://ac.jobdu.com/problem.php?pid=1455 题目描述: 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元, ...

  7. [zz]安装Ubuntu 15.10后要做的事

    很有用,收藏 http://blog.csdn.net/skykingf/article/details/45267517

  8. 使用WebBrowser的记录

    第一:新建一个类,用了获取WebBrowser元素的类 //需要引用 Interop.SHDocVw 和 Microsoft.mshtmlpublic class Element { //根据Name ...

  9. Eyeshot Ultimate 学习笔记(4)

    动画 Eyeshot的官方Demo中有一个功能是近期项目需要用到的,就是动画效果.其中主要运用到BlockReference类,该类下的两个方法MoveTo(Dictionary<string, ...

  10. Linux调整SWAP分区

    刪除原swap分區,重建swap,步驟如下:1,swapoff -a #停止交換分區2,fdisk /dev/sda #進入fdisk,刪除原swap分區,重新建立新分區(swap分區的系統ID是82 ...