题意:

给出n个串,求任意长度为m的字符串包含串的个数的期望。(n<=8,m<=14,给定串的长度不超过12)。

Solution:

首先可以想到应该用概率DP,我们需要至少3维,dp[i][j][k]表示第i个数字为j,已经包含了k个串的概率.

然后,问题是找到状态转移的方法

由于是字符串相关,AC自动机应该是第一个想到的.

然后注意到,对于k个串的k,直接求并不好维护,也没办法判断重复的 .由于只有8个串,自然就想到用更简单的方法,用状态压缩来存已经包含了哪些串.

在建trie图的时候,要注意一个结点的状态应该是包含了它的fail节点的状态的.

从u到v的转移

dp[i+1][u][sta[u]|sta[v]]+=dp[i][v][sta[v]]

#include <iostream>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
const int SD = 26;
const int MAXL = 1000;
struct Tire {int next[MAXL][SD], fail[MAXL], eofs[MAXL];int Root, cnt;int newnode() {for (int i = 0; i < SD; i++)     next[cnt][i] = -1;eofs[cnt++] = 0;return cnt - 1;}void init() {cnt = 0;Root = newnode();}void Ins (char buf[], int k) {int len = strlen (buf);int now = Root;for (int i = 0; i < len; i++) {if (next[now][buf[i] - 'a'] == -1)next[now][buf[i] - 'a'] = newnode();now = next[now][buf[i] - 'a'];}eofs[now] |= (1 << k);}void build() {queue<int> ql;fail[Root] = Root;for (int i = 0; i < SD; i++) {if (next[Root][i] == -1)next[Root][i] = Root;else {fail[next[Root][i]] = Root;ql.push (next[Root][i]);}}while (!ql.empty() ) {int now = ql.front(); ql.pop();eofs[now] |= eofs[fail[now]];for (int i = 0; i < SD; i++)if (next[now][i] == -1) {next[now][i] = next[fail[now]][i];}else {fail[next[now][i]] = next[fail[now]][i];ql.push (next[now][i]);}}}
} AC;
int Cs, n, m;
char s[20];
double dp[20][400][1 << 9], tmp = 1. / 26;
int main() {scanf ("%d", &Cs);while (Cs--) {memset (dp, 0, sizeof dp);AC.init();scanf ("%d %d", &n, &m);for (int i = 0; i < n; i++) {scanf ("%s", s);AC.Ins (s, i);}AC.build();dp[0][0][0] = 1;for (int i = 0; i < m; i++)for (int u = 0; u < AC.cnt; u++)for (int st = 0; st < (1 << n); st++)if (dp[i][u][st] > 0)for (int j = 0; j < SD; j++) {int v = AC.next[u][j];dp[i + 1][v][st | AC.eofs[v]] += dp[i][u][st] * tmp;}double ans = 0;for (int i = 0; i < AC.cnt; i++)for (int st = 0; st < (1 << n); st++)if (dp[m][i][st] > 0) {int sum = 0;for (int k = 0; k < n; k++)if (st & (1 << k) ) sum++;ans += dp[m][i][st] * sum;}printf ("%.6f\n", ans);}
}

View Code

转载于:https://www.cnblogs.com/keam37/p/4442799.html

WHU 1572 Cyy and Fzz (AC自动机 dp )相关推荐

  1. WHU 1572 Cyy and Fzz(AC自动机+dp)

    题意:给出n个模板串,随机一个串,求出现模板串个数的期望(相同算一个). 做法:比赛时误以为是求模板串出现了几次,用dp[i][j]代表在第i个节点还要走l步的期望,然后记忆化搜索..不停的wa.. ...

  2. uvalive4842(AC自动机+DP)

    题意: 给出猴子打字时打某个字母的概率,猴子最多可以敲键盘m次,问得到的长度是m的单词包含模式串的概率. 思路: AC自动机+dp. 首先,我们用模式串构造一个AC自动机,用dp[i]][j]表示当前 ...

  3. HDU 2296 Ring AC自动机 + DP

    题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的. 解题思路:  AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串 ...

  4. bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5187  Solved: 2136 [Submit][St ...

  5. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  6. [AC自动机+dp] whu oj 1572 I - Cyy and Fzz

    题意: 给你n个串,求长度为l的串包含n个串个数的期望. 思路: 自动机dp[i][j][k] 长度为i在节点j状态为k的概率. 然后遍历一遍求期望. 代码: #include"cstdli ...

  7. woj1572 Cyy and Fzz KMP / AC自动机 + DP

    题目:http://acm.whu.edu.cn/land/problem/detail?problem_id=1572 题意:  有n个目标串,长度均小于15,(n<=8),现在随机写一个长度 ...

  8. POJ 3691 DNA repair AC自动机 + DP

    题意:给你只包含'A','G','T','C'四个字母的n个模板串和1个文本串,问你文本串改变多少个字符就可以使得文本串中没有一个模板串 解题思路: 我们可以知道  dp[i][j] 为文本串到 第i ...

  9. 【HDU 4511】小明系列故事——女友的考验(AC自动机+DP)

    Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: ...

最新文章

  1. tp5权限管理代码_权限系统控制到按钮级别开源推荐 Spring BootShiroVue
  2. java面试 socket_【面试题】Java 的通信编程,编程题(或问答),用JAVA SOCKET 编程,读服务器几个字符,再写入本地显示?...
  3. mysql如果索引为uid间隙锁_mysql 开发进阶篇系列 10 锁问题 (使用“索引或间隙锁”的锁冲突)...
  4. hive脚本执行方式
  5. git 短写设置_如何在短短几分钟内设置一个Git客户端
  6. 普通人到底要靠什么才能改变命运?
  7. 解决Failed to connect to raw.githubusercontent.com port 443的办法
  8. C#中String类的几个方法(IndexOf、LastIndexOf、Substring)
  9. 使用PHP输出中文JSON字符串
  10. 一些有趣、奇葩、实用的网站
  11. 用两个队列实现栈---用两个队列实现栈
  12. wowza配置rtsp/rtp播放
  13. stm32 火灾自动报警及联动控制源码_火灾自动报警系统和消防联动系统的区别
  14. 使用Vue单文件组件添加删除列表
  15. Dev-cpp 配置新编译器
  16. 换了爸爸,推特用户坐不住了……
  17. 见微知著,从小需求里看产品的抉择和定位
  18. Linux-Apache服务器常规设置——用户个人主页
  19. 爷爷八十大寿,程序员为他写了一个书本朗读App
  20. 网络电视经常出现服务器无响应,为什么pps总是显示服务器未能响应停止播放

热门文章

  1. DVWA-Reflected XSS
  2. 转 c#性能优化秘密
  3. win7系统笔记本作为wifi热点提供无线连接
  4. gtx1660是什么级别的_GTX1660显卡首测:1060终于可以退休了!
  5. iOS 图标上的数字
  6. 新电脑必备的4款宝藏软件,绿色、安全、无捆绑,提高工作效率
  7. Asynctask源码级解析,深度探索源码之旅
  8. 《底层逻辑-半秒钟看透问题本质》读后感
  9. Redis - 使用scan代替keys与hgetall操作
  10. 相信积累的力量——《把时间当作朋友》读后感