2016ACM/ICPC亚洲区沈阳站H - Guessing the Dice Roll HDU - 5955 ac自动机+概率dp+高斯消元
http://acm.hdu.edu.cn/showproblem.php?pid=5955
题意:给你长度为l的n组数,每个数1-6,每次扔色子,问你每个串第一次被匹配的概率是多少
题解:先建成ac自动机构造fail数组,然后因为fail指针可能向前转移所以不能不能直接递推dp,需要高斯消元解方程,对于节点i,假设不是结束点而且能转移到它的点有a1,a2...an,那么dp[i]=1/6*dp[a1]+1/6*dp[a2]+...+1/6*a[n],然后我们可以列出n个方程,高斯消元然后找到每个串结尾点的概率就是答案了
- //#pragma comment(linker, "/stack:200000000")
- //#pragma GCC optimize("Ofast,no-stack-protector")
- //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- //#pragma GCC optimize("unroll-loops")
- #include<bits/stdc++.h>
- #define fi first
- #define se second
- #define mp make_pair
- #define pb push_back
- #define pi acos(-1.0)
- #define ll long long
- #define vi vector<int>
- #define mod 1000000007
- #define C 0.5772156649
- #define ls l,m,rt<<1
- #define rs m+1,r,rt<<1|1
- #define pil pair<int,ll>
- #define pli pair<ll,int>
- #define pii pair<int,int>
- #define cd complex<double>
- #define ull unsigned long long
- #define base 1000000000000000000
- #define fio ios::sync_with_stdio(false);cin.tie(0)
- using namespace std;
- const double g=10.0,eps=1e-;
- const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;
- int l;
- double a[N][N],ans[N];
- void gauss(int n)
- {
- for(int i=;i<n;i++)
- {
- if(a[i][i]==)
- {
- int id=;
- for(int j=i+;j<=n;j++)
- if(a[j][i]!=)
- id=j;
- for(int j=i;j<=n+;j++)
- swap(a[i][j],a[id][j]);
- }
- for(int j=i+;j<=n;j++)
- {
- double t=a[j][i]/a[i][i];
- for(int k=i;k<=n+;k++)
- a[j][k]-=(a[i][k]*t);
- }
- }
- // for(int i=1;i<=n;i++)
- // {
- // for(int j=1;j<=n+1;j++)
- // printf("%.12f ",a[i][j]);
- // puts("");
- // }
- for(int i=n;i>=;i--)
- {
- for(int j=i+;j<=n;j++)
- a[i][n+]-=ans[j]*a[i][j];
- ans[i]=a[i][n+]/a[i][i];
- }
- }
- char s[N];
- struct ACM{
- int root,tot;
- int Next[N][],fail[N],End[N];
- int newnode()
- {
- memset(Next[tot],-,sizeof Next[tot]);
- End[tot]=;
- return tot++;
- }
- void init()
- {
- tot=;
- root=newnode();
- }
- void ins(int i)
- {
- int now=root;
- for(int i=,x;i<l;i++)
- {
- scanf("%d",&x);x--;
- if(Next[now][x]==-)
- Next[now][x]=newnode();
- now=Next[now][x];
- }
- End[now]=i;
- }
- void build()
- {
- queue<int>q;
- fail[root]=root;
- for(int i=;i<;i++)
- {
- if(Next[root][i]==-)Next[root][i]=root;
- else
- {
- fail[Next[root][i]]=root;
- q.push(Next[root][i]);
- }
- }
- while(!q.empty())
- {
- int now=q.front();
- q.pop();
- if(End[fail[now]])End[now]=End[fail[now]];
- for(int i=;i<;i++)
- {
- if(Next[now][i]==-)Next[now][i]=Next[fail[now]][i];
- else
- {
- fail[Next[now][i]]=Next[fail[now]][i];
- q.push(Next[now][i]);
- }
- }
- }
- }
- void solve()
- {
- memset(a,,sizeof a);
- a[][tot+]=-1.0;
- for(int i=;i<tot;i++)
- {
- a[i+][i+]=-1.0;
- if(End[i])continue;
- for(int j=;j<;j++)a[Next[i][j]+][i+]+=1.0/;
- }
- // for(int i=1;i<=tot;i++)
- // {
- // for(int j=1;j<=tot+1;j++)printf("%.5f ",a[i][j]);
- // puts("");
- // }
- gauss(tot);
- bool ok=;
- for(int i=;i<tot;i++)
- {
- if(End[i])
- {
- if(!ok)printf("%.6f",ans[i+]);
- else printf(" %.6f",ans[i+]);
- ok=;
- }
- }
- puts("");
- }
- }ac;
- int main()
- {
- int T;scanf("%d",&T);
- while(T--)
- {
- ac.init();
- int n;
- scanf("%d%d",&n,&l);
- for(int i=;i<n;i++)ac.ins(i+);
- ac.build();
- ac.solve();
- }
- return ;
- }
- /***********************
- 1
- 2 2
- 1 1
- 2 1
- ***********************/
2016ACM/ICPC亚洲区沈阳站H - Guessing the Dice Roll HDU - 5955 ac自动机+概率dp+高斯消元的更多相关文章
- HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 5948 Thickest Burger 【模拟】 (2016ACM/ICPC亚洲区沈阳站)
Thickest Burger Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- HDU 5949 Relative atomic mass 【模拟】 (2016ACM/ICPC亚洲区沈阳站)
Relative atomic mass Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- hdu5955 Guessing the Dice Roll【AC自动机】【高斯消元】【概率】
含高斯消元模板 2016沈阳区域赛http://acm.hdu.edu.cn/showproblem.php?pid=5955 Guessing the Dice Roll Time Limit: 2 ...
- 2016ACM/ICPC亚洲区沈阳站 - A/B/C/E/G/H/I - (Undone)
链接:传送门 A - Thickest Burger - [签到水题] ACM ICPC is launching a thick burger. The thickness (or the heig ...
- 2016ACM/ICPC亚洲区沈阳站-重现赛
C.Recursive sequence 求ans(x),ans(1)=a,ans(2)=b,ans(n)=ans(n-2)*2+ans(n-1)+n^4 如果直接就去解...很难,毕竟不是那种可以直 ...
- 2016ACM/ICPC亚洲区沈阳站 Solution
A - Thickest Burger 水. #include <bits/stdc++.h> using namespace std; int t; int a, b; int main ...
- 2016ACM/ICPC亚洲区沈阳站-重现赛赛题
今天做的沈阳站重现赛,自己还是太水,只做出两道签到题,另外两道看懂题意了,但是也没能做出来. 1. Thickest Burger Time Limit: 2000/1000 MS (Java/Oth ...
随机推荐
- keeplived + mysql双主复制部署 --原创
环境: master 1: 192.168.100.10 oracle linux 7.4 mysql 5.7.1 master 2: 192.168.100.11 oracle linux ...
- vim高亮显示文本
行列高亮设置 • 行高亮 " 设置高亮行的颜色,ctermbg设定背景色,ctermfg设定前景色 set cursorline hi CursorLine cterm=NONE cterm ...
- Mac下 Visual VM 无法检测到本地的Java进程
我下载的是VisualVM1.4 下载完成之后,在左边栏Local哪里只有VisualVM自己的进程. 我本地启动的eclipse和intelliJ都没有检测到. 网上查阅后都是Window下的解决方 ...
- AtCoder Regular Contest 080 C - 4-adjacent
地址:http://arc080.contest.atcoder.jp/tasks/arc080_a 题目: C - 4-adjacent Time limit : 2sec / Memory lim ...
- RPC细节
服务化有什么好处? 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图所示: 服务A:欧洲团队维护,技术背景是Java 服务B:美洲团队维护,用C++实现 ...
- iOS 动态调用方法
- (void)bugly { dispatch_async(dispatch_get_global_queue(0, 0), ^{ if (NSClassFromString(@"Bu ...
- Windows MFC控件消息编程
1. Progress Bar Control Messages PBM_DELTAPOS PBM_GETPOS PBM_GETRANGE PBM_SETBARCOLOR ...
- GZFramework错误(升级修改)日志
sqlserver下事务中处理出现为初始化selectcommand的connection属性修改CommandDataBase中的PrepareCommand方法
- 【Thinking in Java, 4e】访问权限控制
[包:库单元] 编译单元的概念. 一个.java文件就是一个编译单元,一个编译单元只能有一个public类,编译单元中的非public类一般是用于为public类提供支持的,这些类在包外不可见. im ...
- Java-GC垃圾收集器
1. Serial young generation “单线程”收集器,是指进行垃圾收集时,必须暂停其他所有工作线程,直到收集结束.是历史最悠久的收集器. 2. Serial Old tenured ...