UVA 1358 - Generator(dp+高斯消元+KMP)
UVA 1358 - Generator
题意:有m种字符(从'A'開始往后数的大写字母),如今有一个字符串,长度不超过12。如今每次随机生成一个字母,要求能产生该字符串的期望长度
思路:dp[i]表示产生长度i的期望长度,那么每次产生一个字符。相应m种转移,每种转移的概率为1/m,转移后的长度能够利用KMP的next数组去高速获得,然后因为转移可能形成环的情况,所以无法直接DP,利用高斯消元去解方程组
代码:
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <vector>
- using namespace std;
- typedef long long type;
- struct Frac {
- type a, b;
- Frac() {a = 0; b = 1;}
- Frac(type a, type b) {this->a = a; this->b = b; deal();}
- void init() {a = 0; b = 1;}
- type gcd(type a, type b) {
- while (b) {
- type tmp = a % b;
- a = b;
- b = tmp;
- }
- return a;
- }
- void deal() {
- type d = gcd(a, b);
- a /= d; b /= d;
- if (b < 0) {
- a = -a;
- b = -b;
- }
- }
- Frac operator + (Frac c) {
- Frac ans;
- ans.a = a * c.b + b * c.a;
- ans.b = b * c.b;
- ans.deal();
- return ans;
- }
- Frac operator - (Frac c) {
- Frac ans;
- ans.a = a * c.b - b * c.a;
- ans.b = b * c.b;
- ans.deal();
- return ans;
- }
- Frac operator * (Frac c) {
- Frac ans;
- ans.a = a * c.a;
- ans.b = b * c.b;
- ans.deal();
- return ans;
- }
- Frac operator / (Frac c) {
- Frac ans;
- ans.a = a * c.b;
- ans.b = b * c.a;
- ans.deal();
- return ans;
- }
- void operator += (Frac c) {*this = *this + c;}
- void operator += (type c) {*this = *this + Frac(c, 1);}
- void operator -= (Frac c) {*this = *this - c;}
- void operator *= (Frac c) {*this = *this * c;}
- void operator /= (Frac c) {*this = *this / c;}
- bool operator > (Frac c) {return a * c.b > b * c.a;}
- bool operator == (Frac c) { return a * c.b == b * c.a;}
- bool operator < (Frac c) {return !(*this < c && *this == c);}
- bool operator >= (Frac c) {return !(*this < c);}
- bool operator <= (Frac c) {return !(*this > c);}
- bool operator != (Frac c) {return !(*this == c);}
- bool operator != (type c) {return *this != Frac(c, 1);}
- void operator = (type c) {this->a = c; this->b = 1;}
- };
- typedef long long ll;
- Frac A[15][15];
- int t, m, n, next[15];
- char str[15];
- void getnext() {
- next[0] = next[1] = 0;
- int j = 0;
- for (int i = 2; i <= n; i++) {
- while (j && str[i] != str[j + 1]) j = next[j];
- if (str[i] == str[j + 1]) j++;
- next[i] = j;
- }
- }
- void build() {
- for (int i = 0; i <= n; i++)
- for (int j = 0; j <= n + 1; j++)
- A[i][j].init();
- getnext();
- A[n][n] = 1;
- for (int i = 0; i < n; i++) {
- A[i][i] = 1;
- A[i][n + 1] = 1;
- for (int j = 0; j < m; j++) {
- if (str[i + 1] == j + 'A')
- A[i][i + 1] += Frac(-1, m);
- else {
- int tmp = i;
- int flag = 1;
- while (tmp) {
- tmp = next[tmp];
- if (str[tmp + 1] == j + 'A') {
- flag = 0;
- A[i][tmp + 1] += Frac(-1, m);
- break;
- }
- }
- if (flag) A[i][0] += Frac(-1, m);
- }
- }
- }
- }
- ll gauss() {
- for (int i = 0; i <= n; i++) {
- int r;
- for (r = i; r <= n; r++)
- if (A[r][i] != 0) break;
- for (int j = i; j <= n + 1; j++)
- swap(A[i][j], A[r][j]);
- for (int j = n + 1; j > i; j--)
- A[i][j] /= A[i][i];
- A[i][i] = 1;
- for (int j = 0; j <= n; j++) {
- if (i == j) continue;
- if (A[j][i] != 0) {
- for (int k = n + 1; k > i; k--)
- A[j][k] -= A[j][i] * A[i][k];
- A[j][i] = 0;
- }
- }
- }
- return (A[0][n + 1] / A[0][0]).a;
- }
- int main() {
- int cas = 0;
- scanf("%d", &t);
- while (t--) {
- scanf("%d%s", &m, str + 1);
- n = strlen(str + 1);
- build();
- printf("Case %d:\n", ++cas);
- printf("%lld\n", gauss());
- if (t) printf("\n");
- }
- return 0;
- }
版权声明:本文博主原创文章,博客,未经同意不得转载。
UVA 1358 - Generator(dp+高斯消元+KMP)的更多相关文章
- BZOJ 3270: 博物馆 [概率DP 高斯消元]
http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...
- BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元
BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...
- BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元
BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...
- LightOJ - 1151概率dp+高斯消元
概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到 ...
- 【BZOJ3640】JC的小苹果 概率DP+高斯消元
[BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...
- 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元
题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...
- BZOJ3270 博物館 概率DP 高斯消元
BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...
- 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径
2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 682 Solved: 384[Submit][Stat ...
- 2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)
题目链接 题意 :小女孩注册了两个比赛的帐号,初始分值都为0,每做一次比赛如果排名在前两百名,rating涨50,否则降100,告诉你她每次比赛在前两百名的概率p,如果她每次做题都用两个账号中分数低的 ...
随机推荐
- mysql 编译安装提示“checking for termcap functions library... configure: error: No curses/termcap library found”
原因: 缺少ncurses安装包 解决办法: 下载安装相应软件包 一.如果你的系统是RedHat系列: yum list|grep ncurses yum -y install ncurses-dev ...
- 利用python 提取log 文件里的关键句子,并进行统计分析
利用python开发了一个提取sim.log 中的各个关键步骤中的时间并进行统计的程序: #!/usr/bin/python2.6 import re,datetime file_name='/hom ...
- 去掉windows文件末尾的^M: %s/\r//g
去掉windows文件末尾的^M: %s/\r//g
- 【ASP.NET】怎样使用类创建公共函数,在不同ASP.NET页面间反复调用
为了降低代码冗余,应将公共函数写在类中,供不同ASP.NET页面调用. 1,先新建一个类,并在类中加入函数逻辑 namespace public_function_demo { public clas ...
- xpages的comboBox能够手动输入
在xpages使用的comboBox默认仅仅能选择.不能手动输入,怎么才干手动输入呢?经过查找资料和測试,最终能够了,请大家能够试试 假设试不行,能够再下载demo http://download.c ...
- Shell split character line by line
while read line do account=`echo "$line"| cut -c1-9`'|' account ...
- 虚拟化技术学习(一)在VMware虚拟机中安装KVM
近期一直研究虚拟化技术,曾经对VMware虚拟机有一定的了解,近期突发奇想,能不能在VMware虚拟机中再装一个虚拟机呢? 那么问题就来了,首先,你须要一台电脑,vmware软件,(本人的电脑配置渣渣 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block 到目前为止,我们使用的模块都是在同一个配置 ...
- ASF (0) - ASF Java 项目总览
Apache .NET Ant Library This is a library of Ant tasks that help developing .NET software. It includ ...
- PHP计算中文字符串长度 、截取相应中文字符串
PHP计算字符串长度 及其 截取相应中文字符串 计算字符长度: $gouWu = '美日汇http://www.hnzyxok.com/'; echo mb_strlen($gouWu,' ...