WHU 1572 Cyy and Fzz (AC自动机 dp )
题意:
给出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]]
![](/assets/blank.gif)
![](/assets/blank.gif)
#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 )相关推荐
- WHU 1572 Cyy and Fzz(AC自动机+dp)
题意:给出n个模板串,随机一个串,求出现模板串个数的期望(相同算一个). 做法:比赛时误以为是求模板串出现了几次,用dp[i][j]代表在第i个节点还要走l步的期望,然后记忆化搜索..不停的wa.. ...
- uvalive4842(AC自动机+DP)
题意: 给出猴子打字时打某个字母的概率,猴子最多可以敲键盘m次,问得到的长度是m的单词包含模式串的概率. 思路: AC自动机+dp. 首先,我们用模式串构造一个AC自动机,用dp[i]][j]表示当前 ...
- HDU 2296 Ring AC自动机 + DP
题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的. 解题思路: AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串 ...
- bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 5187 Solved: 2136 [Submit][St ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- [AC自动机+dp] whu oj 1572 I - Cyy and Fzz
题意: 给你n个串,求长度为l的串包含n个串个数的期望. 思路: 自动机dp[i][j][k] 长度为i在节点j状态为k的概率. 然后遍历一遍求期望. 代码: #include"cstdli ...
- woj1572 Cyy and Fzz KMP / AC自动机 + DP
题目:http://acm.whu.edu.cn/land/problem/detail?problem_id=1572 题意: 有n个目标串,长度均小于15,(n<=8),现在随机写一个长度 ...
- POJ 3691 DNA repair AC自动机 + DP
题意:给你只包含'A','G','T','C'四个字母的n个模板串和1个文本串,问你文本串改变多少个字符就可以使得文本串中没有一个模板串 解题思路: 我们可以知道 dp[i][j] 为文本串到 第i ...
- 【HDU 4511】小明系列故事——女友的考验(AC自动机+DP)
Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: ...
最新文章
- tp5权限管理代码_权限系统控制到按钮级别开源推荐 Spring BootShiroVue
- java面试 socket_【面试题】Java 的通信编程,编程题(或问答),用JAVA SOCKET 编程,读服务器几个字符,再写入本地显示?...
- mysql如果索引为uid间隙锁_mysql 开发进阶篇系列 10 锁问题 (使用“索引或间隙锁”的锁冲突)...
- hive脚本执行方式
- git 短写设置_如何在短短几分钟内设置一个Git客户端
- 普通人到底要靠什么才能改变命运?
- 解决Failed to connect to raw.githubusercontent.com port 443的办法
- C#中String类的几个方法(IndexOf、LastIndexOf、Substring)
- 使用PHP输出中文JSON字符串
- 一些有趣、奇葩、实用的网站
- 用两个队列实现栈---用两个队列实现栈
- wowza配置rtsp/rtp播放
- stm32 火灾自动报警及联动控制源码_火灾自动报警系统和消防联动系统的区别
- 使用Vue单文件组件添加删除列表
- Dev-cpp 配置新编译器
- 换了爸爸,推特用户坐不住了……
- 见微知著,从小需求里看产品的抉择和定位
- Linux-Apache服务器常规设置——用户个人主页
- 爷爷八十大寿,程序员为他写了一个书本朗读App
- 网络电视经常出现服务器无响应,为什么pps总是显示服务器未能响应停止播放