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,如果她每次做题都用两个账号中分数低的 ...
随机推荐
- [leetcode]3 Sum closest
问题叙述性说明: Given an array S of n integers, find three integers in S such that the sum is closest to a ...
- hdu1561(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 题意:n座城堡,每个里面都有宝物,要求在你可以攻占m个城堡得到的最多的宝物,但是如果要攻破一个城 ...
- URAL 1297 后缀数组:求最长回文子串
思路:这题下午搞了然后一直WA,后面就看了Discuss,里面有个数组:ABCDEFDCBA,这个我输出ABCD,所以错了. 然后才知道自己写的后缀数组对这个回文子串有bug,然后就不知道怎么改了. ...
- Android网络编程http派/申请服务
最近的研究Android网络编程知识,这里有一些想法,今晚学习.与您分享. 在实际的应用程序的开发非常需要时间appserver请求数据,那么app怎样发送请求呢?以下的代码就是当中的一种情况.使用H ...
- U5首次登录
1.在Llinx中,大小写字母是不一样的东西. 2.date可以查看日期,date的正确格式是:date +%Y/%m/%d/%H/%M(左边这句话所想表达的意思是年的字母必须为大写,月的必须为小写. ...
- 简单工厂 VS 工厂方法 VS 抽象工厂
说到设计模式.自然少不了简单工厂模式.工厂方法和抽象工厂这三姐妹. 它们之间可谓是各有所长,术业专攻啊!这篇博客来简单的梳理一下三者之间的关系. 那么工厂又是什么意思呢?结合三者的特点,我觉得能够这样 ...
- Android编程获取网络连接状态及调用网络配置界面
获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...
- oracle spfile和pfile文件(转)
--======================== -->Oracle 参数文件 --======================== /* 参数文件(10g中的参数文件) 主要用来记录数据库 ...
- ExtJs自学教程(1):从一切API开始
称号 记得 本系列文章是不是引进全套焦点ExtJs使用,您只需专注于解决ExtJs思考问题.人们不写长篇大论.别人能学会自立.l 有些人只要学会CSS的javascript对于英文不至于很蹩脚(以辅 ...
- python可变参数调用函数的问题
已使用python实现的一些想法,近期使用python这种出现的要求,它定义了一个函数,第一种是一般的参数,第二个参数是默认,并有可变参数.在第一项研究中python时间,不知道keyword可变参数 ...