bzoj 4820: [Sdoi2017]硬币游戏【kmp+高斯消元】
有点神,按照1444的做法肯定会挂
注意到它的概率是相同的,所以可以简化状态
详见http://www.cnblogs.com/candy99/p/6701221.html
https://www.cnblogs.com/liu-runda/p/6919077.html
总之就是靠在kmp中的ne数组上跳来找到对当前串概率有影响的串然后把概率加起来……
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=305;
int n,m,ne[N][N];
double a[N][N],p[N];
char c[N][N];
void gtne(char s[],int ne[])
{
for(int i=2,j=0;i<=m;i++)
{
while(j&&s[j+1]!=s[i])
j=ne[j];
if(s[j+1]==s[i])
j++;
ne[i]=j;
}
}
void gaosi(int n)
{
for(int i=1;i<=n;i++)
{
int nw=i;
for(int j=i+1;j<=n;j++)
if(fabs(a[j][i])>fabs(a[nw][i]))
nw=j;
for(int j=i;j<=n+1;j++)
swap(a[i][j],a[nw][j]);
for(int j=i+1;j<=n+1;j++)
a[i][j]/=a[i][i];
a[i][i]=1;
for(int j=i+1;j<=n;j++)
{
for(int k=i+1;k<=n+1;k++)
a[j][k]-=a[j][i]*a[i][k];
a[j][i]=0;
}
}
for(int i=n-1;i>=1;i--)
{
for(int j=i+1;j<=n;j++)
a[i][n+1]-=a[j][n+1]*a[i][j];
a[i][n+1]/=a[i][i];
}
}
int main()
{
scanf("%d%d",&n,&m);
p[0]=1;
for(int i=1;i<=m;i++)
p[i]=p[i-1]/2;
for(int i=1;i<=n;i++)
scanf("%s",c[i]+1),a[i][n+1]=-p[m],a[n+1][i]=1;
a[n+1][n+2]=1;
for(int i=1;i<=n;i++)
gtne(c[i],ne[i]);
for(int y=1;y<=n;y++)
for(int x=1;x<=n;x++)
{
int j=0;
for(int i=1;i<=m;++i)
{
while(j&&c[y][j+1]!=c[x][i])
j=ne[y][j];
if(c[y][j+1]==c[x][i])
j++;
}
while(j)
a[y][x]+=p[m-j],j=ne[y][j];
}
gaosi(n+1);
for(int i=1;i<=n;i++)
printf("%.10f\n",a[i][n+2]);
return 0;
}
bzoj 4820: [Sdoi2017]硬币游戏【kmp+高斯消元】的更多相关文章
- BZOJ.4820.[SDOI2017]硬币游戏(思路 高斯消元 哈希/AC自动机/KMP)
BZOJ 洛谷 建出AC自动机,每个点向两个儿子连边,可以得到一张有向图.参照 [SDOI2012]走迷宫 可以得到一个\(Tarjan\)+高斯消元的\(O((nm)^3)\)的做法.(理论有\(6 ...
- 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)
[BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...
- [BZOJ4820]硬币游戏 KMP+高斯消元
4820: [Sdoi2017]硬币游戏 Time Limit: 10 Sec Memory Limit: 128 MB Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的 ...
- [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash)
[BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上, ...
- BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...
- BZOJ 4820 [Sdoi2017]硬币游戏 ——期望DP 高斯消元
做法太神了,理解不了. 自己想到的是建出AC自动机然后建出矩阵然后求逆计算,感觉可以过$40%$ 用一个状态$N$表示任意一个位置没有匹配成功的概率和. 每种匹配不成功的情况都是等价的. 然后我们强制 ...
- P3706-[SDOI2017]硬币游戏【高斯消元,字符串hash】
正题 题目链接:https://www.luogu.com.cn/problem/P3706 题目大意 给出 \(n\) 个长度为 \(m\) 的 \(H/T\) 串. 开始一个空序列,每次随机在后面 ...
- BZOJ 4820 [SDOI2017] 硬币游戏
Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了.同学们觉得要加强趣味性,所以要找 ...
- 4820: [Sdoi2017]硬币游戏
4820: [Sdoi2017]硬币游戏 链接 分析: 期望dp+高斯消元. 首先可以建出AC自动机,Xi表示经过节点i的期望次数,然后高斯消元,这样点的个数太多,复杂度太大.但是AC自动机上末尾节点 ...
随机推荐
- php责任链模式
php 责任链模式 又叫职责链模式.包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的 ...
- webmagic使用手册
https://my.oschina.net/flashsword/blog/180623 重点 SeleniumDownloader 对于一些Javascript动态加载的网页,仅仅使用http模拟 ...
- app后端搜索入门
现在人们的网络生活已经离不开搜索了,遇到不懂的问题,想知道的事情,搜索一下,就知道答案. 在app中,最常见的搜索情景就是搜索用户.只有几百,几千的用户量时,可以直接用用like这样的模糊查询,但是, ...
- softmax函数理解
https://www.zhihu.com/question/23765351 因为这里不太方便编辑公式,所以很多公式推导的细节都已经略去了,如果对相关数学表述感兴趣的话,请戳这里的链接Softm ...
- Maven安装和手动安装jar到仓库
1. 安装Maven 1.下载mvn到本地,解压. 2.新建系统变量MAVEN_HOME,值指向安装目录如D:\apache-maven-3.3.9 3.path变量中增加:%MAVEN_HOME%\ ...
- 打开input输入的时候,css中position:absolute/fixed定位的时候,定位元素上移问题解决
1.异常代码 <style> .box{ min-height: 100vh; width: 100%; position: relative; } .position{ position ...
- JAVA 比较两张图片的相似度的代码
原文:http://www.open-open.com/code/view/1448334323079 import java.awt.image.BufferedImage; import java ...
- firedac数据集的序列和还原
procedure TForm1.Button1Click(Sender: TObject);var stream, stream2: TMemoryStream; buf: TBytes;begin ...
- javascript创建对象总结(javascript高级程序设计)
1.工厂模式 这样的模式抽象创建详细对象的过程.用函数封装特定的接口来创建类. function createStudent(name) { var o = new Object(); o.name ...
- 程序运行中(BSS段、数据段、代码段、堆栈)
程序运行中(BSS段.数据段.代码段.堆栈) BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简 ...