bzoj2553 禁忌
题意
给出一个\(n\)个字符串的字典。对于一个字符串,他的贡献是这个字符串中最多的在字典中出现的不重叠子串的数量。
然后问一个长度为\(len\)的,字符集为前\(alphabet\)个字符的字符串的贡献期望是多少。
思路
首先想如果这个长度为\(len\)的字符串已经给出了。应该怎么算贡献。
只要贪心的在\(AC\)自动机上走,如果走到了字典中字符串的结尾,就回到根节点,然后重新走。
现在没有给出这个字符串,在\(AC\)自动机上表现为每个点的每个儿子都有\(\frac{1}{alphabet}\)的概率存在。
这个题要求求期望,根据期望的线性性。只要求出每个字符串被经过的概率之和\(\times\)贡献,然后加起来就行了。因为每个字符串的贡献都是\(1\),所以只要将他们的概率之和求出来就行了。
然后考虑如何求出来每个字符串被经过的概率。
根据上面的贪心思路。我们可以用\(f[k][i]\)表示走了\(k\)步,走到\(j\)的概率。只要用\(f[k-1][fa[i]]\times \frac{1}{alphabet}\)就行了。
因为\(len\)到了\(10 ^ 9\),所以考虑矩阵快速幂优化,我们可以把从每个点走到另一个点的概率用一个\(n\times n\)矩阵来表示。然后将这个矩阵自乘\(len\)遍就行了。
然后考虑这个矩阵应该怎么得到。首先要在矩阵上新建一个统计答案的点。只要在\(AC\)自动机上\(bfs\)一遍,如果儿子被打过结束标记了,那么就将当前点走到新建点和根节点的概率\(+\frac{1}{alphabet}\).否则就将当前节点走到孩子节点的概率\(+\frac{1}{alphabet}\)。
然后矩阵快速幂就行了。
代码
/*
* @Author: wxyww
* @Date: 2019-01-31 08:45:43
* @Last Modified time: 2019-01-31 10:03:47
*/
#include<cstring>
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<ctime>
#include<bitset>
using namespace std;
typedef long long ll;
typedef long double ld;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
queue<int>q;
struct Mat {
ld a[100][100];
int n;
Mat() {
n = 0;
memset(a,0,sizeof(a));
}
Mat(int x) {
n = x;
for(int i = 0;i <= n;++i) a[i][i] = 1;
}
}C;
char s[20];
ld tmp;
int trie[100][27],tot,bz[400];
void ins() {
int len = strlen(s + 1);
int now = 0;
for(int i = 1;i <= len;++i) {
int x = s[i] - 'a';
if(!trie[now][x]) trie[now][x] = ++tot;
now = trie[now][x];
}
bz[now] = 1;
}
int fail[400],vis[400];
int alp;
void build() {
for(int i = 0;i < alp;++i) if(trie[0][i]) q.push(trie[0][i]);
while(!q.empty()) {
int now = q.front();q.pop();
for(int i = 0;i < alp;++i) {
if(trie[now][i]) fail[trie[now][i]] = trie[fail[now]][i],q.push(trie[now][i]);
else trie[now][i] = trie[fail[now]][i];
}
}
}
void bfs() {
while(!q.empty()) q.pop();
q.push(0);vis[0] = 1;
while(!q.empty()) {
int now = q.front();q.pop();
for(int i = 0;i < alp;++i) {
if(!vis[trie[now][i]]) vis[trie[now][i]] = 1,q.push(trie[now][i]);
if(bz[trie[now][i]]) C.a[now][0] += tmp, C.a[now][tot] += tmp;
else C.a[now][trie[now][i]] += tmp;
}
}
}
Mat operator * (Mat x,Mat y) {
int n = x.n;
Mat ret;
ret.n = n;
for(int k = 0;k <= n;++k) {
for(int i = 0;i <= n;++i) {
for(int j = 0;j <= n;++j) {
ret.a[i][j] += x.a[i][k] * y.a[k][j];
}
}
}
return ret;
}
Mat operator ^ (Mat x,int y) {
int n = x.n;
Mat ret(n);
for(;y;y >>= 1,x = x * x) {
if(y & 1) ret = ret * x;
}
return ret;
}
int main() {
int n = read(),len = read();
cin>>alp;
tmp = (ld)1 / (ld)alp;
for(int i = 1;i <= n;++i) {
scanf("%s",s + 1);
ins();
}
build();
++tot;
bfs();
C.n = tot;
C.a[tot][tot] = 1;
C = C ^ len;
printf("%.7Lf",C.a[0][tot]);
return 0;
}
bzoj2553 禁忌的更多相关文章
- BZOJ2553 [BeiJing2011]禁忌 AC自动机 矩阵
原文链接http://www.cnblogs.com/zhouzhendong/p/8196279.html 题目传送门 - BZOJ2553 题意概括 引用一下lych大佬的: 在字母只有前alph ...
- 【BZOJ2553】[BeiJing2011]禁忌 AC自动机+期望DP+矩阵乘法
[BZOJ2553][BeiJing2011]禁忌 Description Magic Land上的人们总是提起那个传说:他们的祖先John在那个东方岛屿帮助Koishi与其姐姐Satori最终战平. ...
- BZOJ2553: [BeiJing2011]禁忌
2553: [BeiJing2011]禁忌 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 203 Solved: ...
- BZOJ2553[BeiJing2011]禁忌——AC自动机+概率DP+矩阵乘法
题目描述 Magic Land上的人们总是提起那个传说:他们的祖先John在那个东方岛屿帮助Koishi与其姐姐Satori最终战平.而后,Koishi恢复了读心的能力…… 如今,在John已经成为传 ...
- BZOJ2553 Beijing2011禁忌(AC自动机+动态规划+矩阵快速幂+概率期望)
考虑对一个串如何分割能取得最大值.那么这是一个经典的线段覆盖问题,显然每次取右端点尽量靠前的串.于是可以把串放在AC自动机上跑,找到一个合法串后就记录并跳到根. 然后考虑dp.设f[i][j]表示前i ...
- BZOJ2553 [BeiJing2011]禁忌 【AC自动机 + dp + 矩乘优化】
题目链接 BZOJ2553 题解 话说在前,此题卡精度,最好开long double 先建\(AC\)自动机 求期望,逆着求,设\(f[i][j]\)为长度为\(i\)的串,当前匹配AC自动机\(j\ ...
- 【bzoj2553】[BeiJing2011]禁忌
2553: [BeiJing2011]禁忌 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 595 Solved: ...
- [BZOJ2553][BeiJing2011]禁忌 dp+AC自动机+矩阵快速幂
2553: [BeiJing2011]禁忌 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1206 Solved ...
- bzoj2553【beijing2011】禁忌
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=2553 sol :puts("nan"); (逃~ ac自动机+矩阵快速幂 ...
随机推荐
- CSS自定义属性expression_r
CSS的出现使网页制作者在对网页元素的控制方便许多,当然,有利必有弊,CSS只能对颜色.大小.距离等静态样式有效,对于要实现某些html元素的动态样式就显得有些力不从心.有了CSS的自定义属性expr ...
- mybatis generator的maven插件,找不到properties的配置文件错误的解决
第一次运行的时候,maven插件是正确运行了的 但后面对 maven 的 build节点做了一点修改,就开始报错,找不到 properties标签指定的的数据库连接配置文件了 修改部分如下: 这个操作 ...
- linux 地址解析协议 arp
随便转载,保留出处:http://www.cnblogs.com/aaron-agu/ arp –na #查看 arp –s 123.253.68.209 00:19:56:6F:87:D4 #添加
- SQL字段类型bit 查询时注意
sql 查询时 字段=1 或 字段=0 c# 里也是
- javascript帧动画
前面的话 帧动画就是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成的动画.由于是一帧一帧的画,所以帧动画具有非常大的灵活性,几乎可以表现任何想表现的内容. ...
- JarvisOJ Basic veryeasyRSA
已知RSA公钥生成参数: p = 3487583947589437589237958723892346254777 q = 8767867843568934765983476584376578389 ...
- rsync 服务器搭建遇到的问题
问题一: @ERROR: chroot failed rsync error: error starting client-server protocol (code 5) at main.c(152 ...
- LOJ6432 [PKUSC2018] 真实排名 【组合数】
题目分析: 做三个指针然后预处理阶乘就行. 题目代码: #include<bits/stdc++.h> using namespace std; ; ; int n,k; struct n ...
- day2 网络基础
网路基础 网络OSI模型七层: 物理层: 定义特性:机械,电器,功能,过程: 定义接口标准:双绞线,光纤,同轴电缆: 相关协议:无: 数据链路层: 定义帧的开始结束,封装成帧,差错校验,透明传输(防止 ...
- ACM中的fread读入
fread可以加快读入速度,尤其是读特大的二进制文件. #include <cctype> typedef long long LL; char buf[100000],*p1=buf,* ...