uvalive4842(AC自动机+DP)
题意:
给出猴子打字时打某个字母的概率,猴子最多可以敲键盘m次,问得到的长度是m的单词包含模式串的概率。
思路:
AC自动机+dp。
首先,我们用模式串构造一个AC自动机,用dp[i]][j]表示当前猴子正在敲第i个字母且我们在自动机的第j个节点上的概率,转移方程就很好想了,正着dp就可以,具体看代码吧。
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#include<cstring>
#include<cstring>
#include<climits>
#include<sstream>using namespace std;int cnt;
struct node
{int flag;int next[26],fail;
} head[1050];queue<int> q;
double mm[30];
double dp[1050][30];
char s[1050];void build(char *s,int idx)
{int len=strlen(s),k;for(int i=0; i<len; ++i){k=s[i]-'a';if(head[idx].next[k]==0)head[idx].next[k]=(cnt++);idx=head[idx].next[k];}head[idx].flag=1;
}void build_fail(int idx)
{int now;queue<int> q;head[idx].fail=0;q.push(idx);while(!q.empty()){now=q.front();q.pop();for(int i=0; i<26; ++i)if(head[now].next[i]){if(now==0) head[head[now].next[i]].fail=0;else head[head[now].next[i]].fail=head[head[now].fail].next[i];q.push(head[now].next[i]);}else{if(now==0) head[now].next[i]=0;else head[now].next[i]=head[head[now].fail].next[i];}}
}int n,m;
double DP()
{memset(dp,0,sizeof(dp));dp[0][0]=1;for(int i=0; i<m; i++)for(int j=0; j<cnt-1; j++)for(int k=0; k<26; k++)dp[i+1][head[j].next[k]]+=(dp[i][j]*mm[k]);double ans=0;for(int i=0; i<=m; i++)ans+=dp[i][cnt-1];return ans;
}int main()
{//freopen("in.txt","r",stdin);while(scanf("%d%d",&n,&m)!=EOF){if(n==0&&m==0)break;memset(mm,0,sizeof(mm));memset(head,0,sizeof(head));cnt=1;for(int i=1; i<=n; i++){double t;scanf("%s%lf",s,&t);mm[s[0]-'a']=t;}scanf("%s",s);build(s,0);build_fail(0);//printf("cnt=%d\n",cnt);double ans=DP()*100;printf("%.2f%%\n",ans);}return 0;
}
uvalive4842(AC自动机+DP)相关推荐
- 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. [算法 ...
- POJ 3691 DNA repair AC自动机 + DP
题意:给你只包含'A','G','T','C'四个字母的n个模板串和1个文本串,问你文本串改变多少个字符就可以使得文本串中没有一个模板串 解题思路: 我们可以知道 dp[i][j] 为文本串到 第i ...
- 【HDU 4511】小明系列故事——女友的考验(AC自动机+DP)
Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: ...
- CDOJ1633 Video Game Combos [AC自动机+dp]
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1633 AC自动机+BFS AC自动机,参见:http://www.cnblogs.com/luna-lov ...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
题目传送门 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机 ...
- BZOJ3075[USACO 2013 Mar Gold 3.Necklace]——AC自动机+DP
题目描述 给你一个长度为n的字符串A,再给你一个长度为m的字符串B,求至少在A中删去多少个字符才能使得B不是A的子串.注:该题只读入A和B,不读入长度,先读入A,再读入B.数据保证A和B中只含小写字母 ...
- Codeforces 1015F Bracket Substring AC自动机 + dp
Bracket Substring 这么垃圾的题怎么以前都不会写啊, 现在一眼怎么就会啊.... 考虑dp[ i ][ j ][ k ][ op ] 表示 已经填了 i 个空格, 末尾串匹配到 所给串 ...
最新文章
- Apache Ignite本机持久性,简要概述
- 技术动态 | 清华大学开源OpenKE:知识表示学习平台
- 云原生数据库如何打造业务弹性
- linux恢复终端默认配置,以gnome-terminal为例,修改gnome3 的默认配置,
- 理解 python 装饰器
- python安装的模块在pycharm中能用吗_pycharm安装python模块
- NSString copy or not (strong)?
- electron 自定义标题栏_electron+vue制作桌面应用--自定义标题栏
- 【2019牛客暑期多校训练营(第八场)E】Explorer【线段树分治维护图连通】
- struts1 和struts 2区别
- 6070. 计算字符串的数字和
- Enterprise Architect:绘制基本包图(详细步骤)
- 工银亚洲见证开户详细过程和攻略
- 执行若依(ruoyi)项目
- 解决:el-input添加clearable属性后出现2个×清除图标
- MXC极域,被严重低估的未来物联网
- OpenSSL 生成证书
- vue使用最新版font-awesome字体图标库(内附花式玩法)
- 哪位前端大神可以帮我看一下我的问题
- Microsoft Visual C++Build Tools安装包丢失或损坏【解决方案】