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,如果她每次做题都用两个账号中分数低的 ...
随机推荐
- C库函数标准编程之fscanf()函数解读及其实验
函数功能 fscanf()函数用于从参数stream的文件流中读取format格式的内容,然后存放到...所指定的变量中去.字符串以空格或换行符结束(实验1中会对它进一步说明) 函数格式 字符格式说明 ...
- 单点更新线段树 RMQ
D. Xenia and Bit Operations time limit per test 2 seconds memory limit per test 256 megabytes input ...
- 转:svn命令行操作
原文:http://zhumeng8337797.blog.163.com/blog/static/10076891420115218821912/SVN命令行 -- ::| 分类: CVS |字号 ...
- Lua 与C 交换 第一篇
编译 windows上编译lua源代码 cl /MD /O2 /W3 /c /DLUA_BUILD_AS_DLL *.c del *.o ren lua.obj lua.o ren luac.obj ...
- XSS学习笔记(一个)-点击劫持
所谓XSS这个场景被触发XSS地方,在大多数情况下,攻击者被嵌入在网页中(问题)该恶意脚本(Cross site Scripting),这里的攻击始终触发浏览器端,攻击的者的目的.一般都是获取用户的C ...
- plist文件读写
- (void)viewDidLoad { [super viewDidLoad]; NSDictionary *dictionary1 = [NSDictionary dictionaryWithO ...
- SharedPreferences共享优先存储的详细解析和原理
共享优先存储: publicvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCont ...
- C#的c/s做出开灯关灯计算?
static void light(Boolean[] lights,int n) { if (n <= 1 || lights.Length<5) return; for ...
- Amazon AWS创建RHEL 7实例
在AWS上登录 如果没有账号的话先注册,参考 http://blog.banban.me/blog/2014/06/09/li-yong-awsmian-fei-zhang-hu-da-jian-vp ...
- ProductHunt,TechCrunch和AppStore的差的值
ProductHunt(产品狩猎)硅谷社区的新产品,起初只存在一个技术性的房子维修.然后进入YC训练营已经收到了几百美元的融资2. 这款产品的形式非常easy.粗产物似乎是一个节目的部位,加上一些评论 ...