UVA 1358 - Generator

option=com_onlinejudge&Itemid=8&page=show_problem&category=524&problem=4104&mosmsg=Submission+received+with+ID+14082913" target="_blank" style="">题目链接

题意:有m种字符(从'A'開始往后数的大写字母),如今有一个字符串,长度不超过12。如今每次随机生成一个字母,要求能产生该字符串的期望长度

思路:dp[i]表示产生长度i的期望长度,那么每次产生一个字符。相应m种转移,每种转移的概率为1/m,转移后的长度能够利用KMP的next数组去高速获得,然后因为转移可能形成环的情况,所以无法直接DP,利用高斯消元去解方程组

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. typedef long long type;
  8.  
  9. struct Frac {
  10.  
  11. type a, b;
  12.  
  13. Frac() {a = 0; b = 1;}
  14. Frac(type a, type b) {this->a = a; this->b = b; deal();}
  15.  
  16. void init() {a = 0; b = 1;}
  17.  
  18. type gcd(type a, type b) {
  19. while (b) {
  20. type tmp = a % b;
  21. a = b;
  22. b = tmp;
  23. }
  24. return a;
  25. }
  26.  
  27. void deal() {
  28. type d = gcd(a, b);
  29. a /= d; b /= d;
  30. if (b < 0) {
  31. a = -a;
  32. b = -b;
  33. }
  34. }
  35.  
  36. Frac operator + (Frac c) {
  37. Frac ans;
  38. ans.a = a * c.b + b * c.a;
  39. ans.b = b * c.b;
  40. ans.deal();
  41. return ans;
  42. }
  43.  
  44. Frac operator - (Frac c) {
  45. Frac ans;
  46. ans.a = a * c.b - b * c.a;
  47. ans.b = b * c.b;
  48. ans.deal();
  49. return ans;
  50. }
  51.  
  52. Frac operator * (Frac c) {
  53. Frac ans;
  54. ans.a = a * c.a;
  55. ans.b = b * c.b;
  56. ans.deal();
  57. return ans;
  58. }
  59.  
  60. Frac operator / (Frac c) {
  61. Frac ans;
  62. ans.a = a * c.b;
  63. ans.b = b * c.a;
  64. ans.deal();
  65. return ans;
  66. }
  67.  
  68. void operator += (Frac c) {*this = *this + c;}
  69. void operator += (type c) {*this = *this + Frac(c, 1);}
  70. void operator -= (Frac c) {*this = *this - c;}
  71. void operator *= (Frac c) {*this = *this * c;}
  72. void operator /= (Frac c) {*this = *this / c;}
  73.  
  74. bool operator > (Frac c) {return a * c.b > b * c.a;}
  75. bool operator == (Frac c) { return a * c.b == b * c.a;}
  76. bool operator < (Frac c) {return !(*this < c && *this == c);}
  77. bool operator >= (Frac c) {return !(*this < c);}
  78. bool operator <= (Frac c) {return !(*this > c);}
  79.  
  80. bool operator != (Frac c) {return !(*this == c);}
  81. bool operator != (type c) {return *this != Frac(c, 1);}
  82.  
  83. void operator = (type c) {this->a = c; this->b = 1;}
  84. };
  85.  
  86. typedef long long ll;
  87.  
  88. Frac A[15][15];
  89.  
  90. int t, m, n, next[15];
  91. char str[15];
  92.  
  93. void getnext() {
  94. next[0] = next[1] = 0;
  95. int j = 0;
  96. for (int i = 2; i <= n; i++) {
  97. while (j && str[i] != str[j + 1]) j = next[j];
  98. if (str[i] == str[j + 1]) j++;
  99. next[i] = j;
  100. }
  101. }
  102.  
  103. void build() {
  104. for (int i = 0; i <= n; i++)
  105. for (int j = 0; j <= n + 1; j++)
  106. A[i][j].init();
  107. getnext();
  108. A[n][n] = 1;
  109. for (int i = 0; i < n; i++) {
  110. A[i][i] = 1;
  111. A[i][n + 1] = 1;
  112. for (int j = 0; j < m; j++) {
  113. if (str[i + 1] == j + 'A')
  114. A[i][i + 1] += Frac(-1, m);
  115. else {
  116. int tmp = i;
  117. int flag = 1;
  118. while (tmp) {
  119. tmp = next[tmp];
  120. if (str[tmp + 1] == j + 'A') {
  121. flag = 0;
  122. A[i][tmp + 1] += Frac(-1, m);
  123. break;
  124. }
  125. }
  126. if (flag) A[i][0] += Frac(-1, m);
  127. }
  128. }
  129. }
  130. }
  131.  
  132. ll gauss() {
  133. for (int i = 0; i <= n; i++) {
  134. int r;
  135. for (r = i; r <= n; r++)
  136. if (A[r][i] != 0) break;
  137. for (int j = i; j <= n + 1; j++)
  138. swap(A[i][j], A[r][j]);
  139. for (int j = n + 1; j > i; j--)
  140. A[i][j] /= A[i][i];
  141. A[i][i] = 1;
  142. for (int j = 0; j <= n; j++) {
  143. if (i == j) continue;
  144. if (A[j][i] != 0) {
  145. for (int k = n + 1; k > i; k--)
  146. A[j][k] -= A[j][i] * A[i][k];
  147. A[j][i] = 0;
  148. }
  149. }
  150. }
  151. return (A[0][n + 1] / A[0][0]).a;
  152. }
  153.  
  154. int main() {
  155. int cas = 0;
  156. scanf("%d", &t);
  157. while (t--) {
  158. scanf("%d%s", &m, str + 1);
  159. n = strlen(str + 1);
  160. build();
  161. printf("Case %d:\n", ++cas);
  162. printf("%lld\n", gauss());
  163. if (t) printf("\n");
  164. }
  165. return 0;
  166. }

版权声明:本文博主原创文章,博客,未经同意不得转载。

UVA 1358 - Generator(dp+高斯消元+KMP)的更多相关文章

  1. BZOJ 3270: 博物馆 [概率DP 高斯消元]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...

  2. BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元

    BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...

  3. BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元

    BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...

  4. LightOJ - 1151概率dp+高斯消元

    概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到 ...

  5. 【BZOJ3640】JC的小苹果 概率DP+高斯消元

    [BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...

  6. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  7. BZOJ3270 博物館 概率DP 高斯消元

    BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...

  8. 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

    2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Stat ...

  9. 2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)

    题目链接 题意 :小女孩注册了两个比赛的帐号,初始分值都为0,每做一次比赛如果排名在前两百名,rating涨50,否则降100,告诉你她每次比赛在前两百名的概率p,如果她每次做题都用两个账号中分数低的 ...

随机推荐

  1. mysql 编译安装提示“checking for termcap functions library... configure: error: No curses/termcap library found”

    原因: 缺少ncurses安装包 解决办法: 下载安装相应软件包 一.如果你的系统是RedHat系列: yum list|grep ncurses yum -y install ncurses-dev ...

  2. 利用python 提取log 文件里的关键句子,并进行统计分析

    利用python开发了一个提取sim.log 中的各个关键步骤中的时间并进行统计的程序: #!/usr/bin/python2.6 import re,datetime file_name='/hom ...

  3. 去掉windows文件末尾的^M: %s/\r//g

    去掉windows文件末尾的^M: %s/\r//g

  4. 【ASP.NET】怎样使用类创建公共函数,在不同ASP.NET页面间反复调用

    为了降低代码冗余,应将公共函数写在类中,供不同ASP.NET页面调用. 1,先新建一个类,并在类中加入函数逻辑 namespace public_function_demo { public clas ...

  5. xpages的comboBox能够手动输入

    在xpages使用的comboBox默认仅仅能选择.不能手动输入,怎么才干手动输入呢?经过查找资料和測试,最终能够了,请大家能够试试 假设试不行,能够再下载demo http://download.c ...

  6. Shell split character line by line

    while read line      do            account=`echo "$line"| cut -c1-9`'|'            account ...

  7. 虚拟化技术学习(一)在VMware虚拟机中安装KVM

    近期一直研究虚拟化技术,曾经对VMware虚拟机有一定的了解,近期突发奇想,能不能在VMware虚拟机中再装一个虚拟机呢? 那么问题就来了,首先,你须要一台电脑,vmware软件,(本人的电脑配置渣渣 ...

  8. 黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block 到目前为止,我们使用的模块都是在同一个配置 ...

  9. ASF (0) - ASF Java 项目总览

    Apache .NET Ant Library This is a library of Ant tasks that help developing .NET software. It includ ...

  10. PHP计算中文字符串长度 、截取相应中文字符串

    PHP计算字符串长度     及其   截取相应中文字符串 计算字符长度: $gouWu = '美日汇http://www.hnzyxok.com/'; echo mb_strlen($gouWu,' ...