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,利用高斯消元去解方程组

代码:

#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)的更多相关文章

  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. WPF界面设计技巧(6)—玩玩数字墨水手绘涂鸦

    原文:WPF界面设计技巧(6)-玩玩数字墨水手绘涂鸦 想让你的程序支持鼠标及手写笔涂鸦吗?只要敲入“<InkCanvas/>”这几个字符,你就会领悟什么叫“很好很强大”,今天我们来做一个手 ...

  2. jenkins 安装 SVN Publisher 后向 svn 提交代码报错: E170001: Authentication required for...

    问题描写叙述 安装并启动 jenkins 后,加入了 SVN Publisher 插件,然后在构建任务的"构建后操作"操作中加入了"Publish to Subversi ...

  3. Java线程中断的本质深入理解(转)

    一.Java中断的现象 首先,看看Thread类里的几个方法: public static boolean interrupted 测试当前线程是否已经中断.线程的中断状态 由该方法清除.换句话说,如 ...

  4. MySQL与Oracle的语法区别详细对比 (转)

    Oracle和mysql的一些简单命令对比 1) SQL> select to_char(sysdate,'yyyy-mm-dd') from dual; SQL> select to_c ...

  5. android升级软件版本号,您安装后的新版本号,成功安装画面没有出现,或直接回到桌面

    Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //an ...

  6. Excel阅读器NPOI

    什么是NPOI? NPOI 它是 POI 项目的 .NET 版本号. POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就能够在没有安装 Office ...

  7. libyuv编

     下载代码(墙): git clone http://git.chromium.org/external/libyuv.git 用 make 编译(linux.mingw.cygwin): mak ...

  8. Nginx Rewrite规则记录

    Rewrite 是一种服务器的重写脉冲技术,它可以使得服务器可以支持 URL 重写,是一种最新流行的服务器技术.它还可以实现限制特定IP访问网站的功能.很多情况下,某个 IP 的访问很容易造成 CPU ...

  9. 用CasperJs自己主动浏览页面

    CasperJs是一个基于PhantomJs的工具,其比起PhantomJs能够更加方便的进行navigation. 一个最简单的CasperJs代码 创建一个文件baidu.js.用来模拟我们訪问百 ...

  10. accept功能

    accept()功能 系统调用 accept() 这将是一个有点陌生的地方! 你可以想象发生 这种事情:这是非常远离你通过倾听 (listen()) 的port连接 (connect()) 你的机器. ...