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]]
#include <iostream>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
const int SD = ;
const int MAXL = ;
struct Tire {
int next[MAXL][SD], fail[MAXL], eofs[MAXL];
int Root, cnt;
int newnode() {
for (int i = ; i < SD; i++) next[cnt][i] = -;
eofs[cnt++] = ;
return cnt - ;
}
void init() {
cnt = ;
Root = newnode();
}
void Ins (char buf[], int k) {
int len = strlen (buf);
int now = Root;
for (int i = ; i < len; i++) {
if (next[now][buf[i] - 'a'] == -)
next[now][buf[i] - 'a'] = newnode();
now = next[now][buf[i] - 'a'];
}
eofs[now] |= ( << k);
}
void build() {
queue<int> ql;
fail[Root] = Root;
for (int i = ; i < SD; i++) {
if (next[Root][i] == -)
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 = ; i < SD; i++)
if (next[now][i] == -) {
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[];
double dp[][][ << ], tmp = . / ;
int main() {
scanf ("%d", &Cs);
while (Cs--) {
memset (dp, , sizeof dp);
AC.init();
scanf ("%d %d", &n, &m);
for (int i = ; i < n; i++) {
scanf ("%s", s);
AC.Ins (s, i);
}
AC.build(); dp[][][] = ;
for (int i = ; i < m; i++)
for (int u = ; u < AC.cnt; u++)
for (int st = ; st < ( << n); st++)
if (dp[i][u][st] > )
for (int j = ; j < SD; j++) {
int v = AC.next[u][j];
dp[i + ][v][st | AC.eofs[v]] += dp[i][u][st] * tmp;
} double ans = ;
for (int i = ; i < AC.cnt; i++)
for (int st = ; st < ( << n); st++)
if (dp[m][i][st] > ) {
int sum = ;
for (int k = ; k < n; k++)
if (st & ( << k) ) sum++;
ans += dp[m][i][st] * sum;
}
printf ("%.6f\n", ans);
}
}
WHU 1572 Cyy and Fzz (AC自动机 dp )的更多相关文章
- POJ1625 Censored!(AC自动机+DP)
题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...
- HDU2296 Ring(AC自动机+DP)
题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...
- HDU2457 DNA repair(AC自动机+DP)
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...
- hdu 4117 GRE Words AC自动机DP
题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...
- hdu 2457(ac自动机+dp)
题意:容易理解... 分析:这是一道比较简单的ac自动机+dp的题了,直接上代码. 代码实现: #include<stdio.h> #include<string.h> #in ...
- HDU 2425 DNA repair (AC自动机+DP)
DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU2296——Ring(AC自动机+DP)
题意:输入N代表字符串长度,输入M代表喜欢的词语的个数,接下来是M个词语,然后是M个词语每个的价值.求字符串的最大价值.每个单词的价值就是单价*出现次数.单词可以重叠.如果不止一个答案,选择字典序最小 ...
- tyvj P1519 博彩游戏(AC自动机+DP滚动数组)
P1519 博彩游戏 背景 Bob最近迷上了一个博彩游戏…… 描述 这个游戏的规则是这样的:每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列:有M个序列,如果某个序列是产生的随机序列的 ...
- bzoj 1030 [JSOI2007]文本生成器(AC自动机+DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题意] 给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个 ...
随机推荐
- jQuery、实例大全
文章出处 http://www.cnblogs.com/suoning/p/5683047.html 一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: ...
- 【C++】冒泡排序、插入排序、快速排序
#include<iostream> using namespace std; void BubbleSort(int *a,int istart,int len)//冒泡排序 { //a ...
- 龙芯8089_D安装debian 8 iessie
参考官方文档:https://wiki.debian.org/DebianYeeloong/HowTo/Install 下载网络引导文件后使用tftpd建立ftfp服务器,然后使用PMON tftp来 ...
- android 国内sdk下载地址及代理, android 环境搭建
http://www.androiddevtools.cn/ http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/android-platform ...
- asterisk错误排查
1.查看某个模块是否被包含在编译选项里了: See menuselect.makeoptsIf you see chan_sip in the MENUSELECT_CHANNELS option, ...
- http://c7sky.com/works/css3slides/#1
http://c7sky.com/works/css3slides/#1 css3 学习
- 【Jsoup爬取网页内容】
思路:根据给定URL分析其源码,得到所需的网页内容的位置,制定规则采集或下载之 采集的图片和文字示例: tags: tag:brazil tag:dog tag:pet tag:pointyfaced ...
- Open XML Format SDK引用
Excel的便捷使得其在非开发人员的办公中非常流行,而Excel确实也提供了很多有用的功能.很多时候我们还需要以Excel为数据源来进行处理或者将Excel作为模板来生成一些报表.在Open XML ...
- 【Linux常用工具】1.1 diff命令的三种格式
diff是用来比较两个文本文件的差异的工具,它有三种格式,下面用实例介绍一下: 准备三个测试文件1.txt 2.txt 3.txt bixiaopeng@bixiaopengtekiMacBook-P ...
- hdu 5073 Galaxy
题意是给定n个点,让求找到一个点p使得sigma( (a[i] - p) ^ 2 ) 最小,其中a[i]表示第i个点的位置.其中有k个点不用算. 思路:发现这道题其实就是求n-k个点方差. 那么推一下 ...