解题:SDOI 2017 硬币游戏
板板的生成函数做法太神仙了,我跑了
朴素的做法是建立AC自动机变成图上的随机游走问题
来仔细考虑一下转移,把状态分成非结尾状态和结尾状态。在一个非结尾状态后补一个串是一定能到达目标串的,但是如果中间出现了前缀等于后缀的情况也可能直接转移到另一个结尾状态。那么我们就用KMP把串之间两两的前缀=后缀的情况状态统计起来列方程,设$x_i$表示$i$胜利的概率,$p[i][j]$表示第$i$个串第一个出现之后又接了一个后缀转移到第$j$个串的概率
那么对于每个$i$有$x_i+\sum\limits_{j=1}^np[i][j]x_j=\frac{1}{2^m}$,后面那个就是正好拼出来的概率
我们发现好像少了点什么东西,方程并不能够解出来,所以挖掘一下没用到的条件:$\sum\limits_{i=1}^nx_i=1$,然后就行了
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define double long double
using namespace std;
const int N=;
const double eps=1e-;
double pw[N],equ[N][N];
int n,m,nxt[N][N]; char str[N][N];
double Calc(int a,int b)
{
double ret=; int o=;
for(int i=;i<m;o+=str[b][i]==str[a][o],i++)
while(o&&str[b][i]!=str[a][o]) o=nxt[a][o];
if(a==b) o=nxt[a][o];
while(o) ret+=pw[m-o],o=nxt[a][o];
return ret;
}
void Guass()
{
for(int i=;i<=n;i++)
{
int tmp=i;
for(int j=i+;j<=n;j++)
if(fabs(equ[j][i])>fabs(equ[tmp][i])) tmp=j;
for(int j=i;j<=n+;j++)
swap(equ[i][j],equ[tmp][j]);
for(int j=;j<=n;j++)
if(i!=j)
{
double tep=equ[j][i]/equ[i][i];
for(int k=i;k<=n+;k++)
equ[j][k]-=tep*equ[i][k];
}
}
for(int i=;i<=n;i++) equ[i][n+]/=equ[i][i],equ[i][i]=;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%s",str[i]);
for(int j=,o=;j<m;j++)
{
while(o&&str[i][o]!=str[i][j]) o=nxt[i][o];
nxt[i][j+]=(str[i][o]==str[i][j])?++o:;
}
}
pw[]=;
for(int i=;i<=;i++) pw[i]=pw[i-]*0.5;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
equ[i][j]=Calc(i,j);
for(int i=;i<=n;i++)
equ[i][n+]=-pw[m],equ[i][i]+=;
for(int i=;i<=n;i++) equ[n+][i]=;
// for(int i=1;i<=n;puts(""),i++)
// for(int j=1;j<=n+1;j++) printf("%.2Lf ",equ[i][j])
n++,equ[n][n+]=,Guass();
for(int i=;i<n;i++) printf("%.10Lf\n",equ[i][n+]);
return ;
}
解题:SDOI 2017 硬币游戏的更多相关文章
- 【BZOJ】2017: [Usaco2009 Nov]硬币游戏(dp+神题+博弈论)
http://www.lydsy.com/JudgeOnline/problem.php?id=2017 这题太神了,我想了一个中午啊 原来是看错题一直没理解题解说的,一直以为题解是错的QAQ “开始 ...
- SDOI 2017 Round1 解题报告
Day 1 T1 数字表格 题目大意 · 求\(\prod\limits_{i=1}^n\prod\limits_{j=1}^mFibonacci(\gcd(i,j))\),\(T\leq1000\) ...
- bzoj 2017 [Usaco2009 Nov]硬币游戏 动态规划
[Usaco2009 Nov]硬币游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 431 Solved: 240[Submit][Status] ...
- 【题解】Luogu p2964 BZOJ 2017[Usaco2009 Nov]硬币游戏
题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game c ...
- TYVJ P1075 硬币游戏 Label:dp
背景 农民John的牛喜欢玩硬币,所以John就为它们发明了一个新的两人硬币游戏,叫做Xoinc. 描述 最初地面上有一堆n个硬币(5<=n<=2000),从上面数第i个硬币的价值为C_i ...
- tyvj P1075 - 硬币游戏 博弈DP
P1075 - 硬币游戏 From price Normal (OI)总时限:10s 内存限制:128MB 代码长度限制:64KB 背景 Background 农民John的牛喜欢玩 ...
- 1289 大鱼吃小鱼 1305 Pairwise Sum and Divide 1344 走格子 1347 旋转字符串 1381 硬币游戏
1289 大鱼吃小鱼 有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右.游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼.从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右 ...
- 腾讯WeTest《2017中国移动游戏质量白皮书》开放预约,再为国内手游把把脉
产品为王,质量先行.如果说2016年是爆款手游相继崛起的一年,那么2017年则更像是打磨精品.建立生态的高手切磋之年.守住一个游戏的质量生命线,方能建立健康生态,方能在如火如荼的行业竞争中角逐到最后. ...
- 腾讯WeTest发布《2017中国移动游戏质量白皮书》,专注手游品质提升
1月8日,腾讯质量开放平台WeTest正式发布<2017中国移动游戏质量白皮书>. 刚刚过去的这一年,市场逐渐成熟,中国移动互联网由增量市场转向存量市场.中国移动游戏市场急剧变化,真正的精 ...
随机推荐
- BQMeetup
BQMeetup 时间:2017.12.19 地点:北京东城区东直门国华投资大厦1105
- ssh无法登录,提示Connection closing...Socket close.
一.问题无法ssh直接连接到服务器 [C:\~]$ ssh 192.168.7.77 Connecting to ... Connection established. To escape to lo ...
- cocos2d-x学习记录5——CCTransition场景过渡
利用CCTransition能够创建出一系列的场景过渡动画,能够使场景切换时更加绚丽丰富. CCTransition派生出很多过渡动画,传入的参数一般包括过渡时间和创建的场景. MyScene.h内容 ...
- [CF1038F]Wrap Around[AC自动机+dp]
题意 题目链接 分析 题意容易转化成求循环之后不包含 \(s\) 的串的个数. 首先建立 AC 自动机.考虑一个暴力的做法:枚举长度为 \(n\) 的字符串 \(t\) 最终(后缀) 和 \(s\) ...
- JQuery快速入门-操作元素的属性和样式
我们在学习JavaScript时,详细介绍了DOM对象.从DOM树可以得知,对DOM的操作,主要包括:元素的属性.内容.值.CSS. 一.元素属性的操作 在 jQuery 中,可以对元素的属性执行获取 ...
- 【转载】SSD断电保护原理
异常掉电的隐患 若没有合理的掉电保护机制,而异常掉电的发生又不可避免,当发生异常掉电,会引发很多问题. (1)丢盘 异常掉电,会使得映射表来不及保存,丢失逻辑地址到物理地址的映射,待重新上电后,SSD ...
- 从头到尾谈一下HTTPS
引言 “你能谈一下HTTPS吗?” “一种比HTTP安全的协议.” “...” 如果面试这样说的话那差不多就gg了,其实HTTPS要展开回答的话内容还挺丰富的.本篇文章详细介绍了HTTPS是什么.为什 ...
- mac10.12.6系统使用cmake安装opencv3.3.0+opencv_contrib-3.3.0
brew与cmake brew安装 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/ins ...
- Linux内核分析 笔记三 构造一个简单的Linux系统MenuOS ——by王玥
一.知识点总结 (一)Linux源代码简介 arch/x86目录下的代码是我们重点关注的 内核启动相关代码都在init目录下 start_kernel函数相当于普通C程序的main函数 linux的核 ...
- C#使用结构体,输入5个人的学号,姓名,分数,按照成绩高低排列打印出来
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...