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,如果她每次做题都用两个账号中分数低的 ...
随机推荐
- 50个最受网友欢迎的HTML5资源下载列表
完整附件下载地址:http://down.51cto.com/data/413867 附件预览: HTML 5游戏源码精选(共含9个游戏源码) http://down.51cto.com/zt/227 ...
- struts(二)——struts框架实现的基本原理
上一篇文章,我们介绍了MVC框架的基本原理,并指出了这个基本框架中存在大量if…else的问题.今天我们来介绍一下struts框架,让struts解决这个问题. 首先,看一下粗略的时序图: Actio ...
- PHP Html 弹窗,本页面弹窗子页面
echo '<script type=text/javascript>window.open("","name1","width=100, ...
- VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT
VMware虚拟机上网络连接(network type)的三种模式--bridged.host-only.NAT VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换 ...
- 从零开始学Xamarin.Forms(五) 技巧
原文:从零开始学Xamarin.Forms(五) 技巧 由于HTML5规范于2014年10月终于定稿,公司.net开发人员较少,国内外已有了较为成熟的UI框架.手机软件硬件的快速发展等等原因,所以我就 ...
- JSP与ASP.PHP的比較
眼下,最经常使用的三种动态网页语言为:ASP(Active Server Pages).PHP(HyperText Preprocessor)及JSP(Java Server Pages). JSP与 ...
- 怎么做fastreport使用离线数据源
近期使用做项目发现fastreport使用在线数据源.紧密耦合的数据库连接字符串.在部署稍加注意.easy错误.因此,是否想到脱机使用的数据源. 官方参考: watermark/2/text/aHR0 ...
- hdu1664 Different Digits
求出n的倍数m,要求m使用的不同数字最少,且最小. 一开始不知道怎么搜,因为不知道m由多少个不同的数字组成. 然后百度了一下,看到和数论有关. m可能使用的数字的个数可能为一个或者两个 a,aa,aa ...
- Windows Phone开发(3):棋子未动,先观全局
原文:Windows Phone开发(3):棋子未动,先观全局 在进行WP开发之前,与其它开发技术一样,我们需要简单了解一个WP应用序的生命周期,我们不一定要深入了解,但至少要知道在应用程序生命周期内 ...
- C语言cgi(1)
1Columbia Universitycs3157 – Advanced ProgrammingSummer 2014, Lab #2, 60ish pointsJune 9, 2014Follow ...