P3706-[SDOI2017]硬币游戏【高斯消元,字符串hash】

1|0正题

题目链接:https://www.luogu.com.cn/problem/P3706


1|1题目大意

给出 n 个长度为 mH/T 串。

开始一个空序列,每次随机在后面加一个 H/T ,求每个串第一次出现的概率。

1n,m300


1|2解题思路

数据范围显然不能在AC自动机上高斯消元,所以得考虑别的方法。

考虑一个很妙的做法,设一个状态N表示目前还没有匹配完成的串,然后考虑串A=HHT和串B=THH,那么在N后面直接插入一个A的概率就是p(N+A)=p(N)×2m

但是考虑到有可能N先拼出了B然后再拼出A,此时考虑B的后缀对应A前缀的有H,HH。那么就有

p(N)×2m=p(N+A)=p(A)+p(B)×22+p(B)×21

这样不难发现对于别的串如果它的一些后缀是这个串的前缀那么就会产生一些概率,用字符串hash匹配即可。

然后会发现还是少了一个方程,最后一个就是所有串的概率和为1就好了。

这样就有n+1个方程了。

时间复杂度:O(n2m+n3)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #define ull unsigned long long using namespace std; const int N=310; const ull g=131; int n,m; double a[N][N],b[N],pw[N]; ull h[N][N],p[N];char s[N]; ull geth(int x,int l,int r) {return h[x][r]-h[x][l-1]*p[r-l+1];} void Gauss(int n){ for(int i=1;i<=n;i++){ int z=i; for(int j=i+1;j<=n;j++) if(a[j][i]>a[z][i])z=i; swap(a[i],a[z]); double x=a[i][i];b[i]/=x; for(int j=i;j<=n;j++)a[i][j]/=x; for(int j=i+1;j<=n;j++){ double rate=-a[j][i]; for(int k=i;k<=n;k++) a[j][k]+=rate*a[i][k]; b[j]+=rate*b[i]; } } for(int i=n;i>=1;i--){ for(int j=1;j<i;j++){ b[j]-=a[j][i]*b[i]; a[j][i]=0; } } return; } int main() { scanf("%d%d",&n,&m);p[0]=1;pw[0]=1; for(int i=1;i<=m;i++) pw[i]=pw[i-1]*0.5,p[i]=p[i-1]*g; for(int i=1;i<=n;i++){ scanf("%s",s+1); for(int j=1;j<=m;j++) h[i][j]=h[i][j-1]*g+s[j]; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=m;k++) if(geth(i,1,k)==geth(j,m-k+1,m)) a[i][j]+=pw[m-k]; for(int i=1;i<=n;i++) a[i][n+1]=-pw[m],a[n+1][i]=1; b[n+1]=1;Gauss(n+1); for(int i=1;i<=n;i++) printf("%.12lf\n",b[i]); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15270666.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(40)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示