题意:

给出猴子打字时打某个字母的概率,猴子最多可以敲键盘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)相关推荐

  1. HDU 2296 Ring AC自动机 + DP

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

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

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

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

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

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

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

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

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

  6. CDOJ1633 Video Game Combos [AC自动机+dp]

    题目地址:http://acm.uestc.edu.cn/problem.php?pid=1633 AC自动机+BFS AC自动机,参见:http://www.cnblogs.com/luna-lov ...

  7. [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)

    题目传送门 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机 ...

  8. BZOJ3075[USACO 2013 Mar Gold 3.Necklace]——AC自动机+DP

    题目描述 给你一个长度为n的字符串A,再给你一个长度为m的字符串B,求至少在A中删去多少个字符才能使得B不是A的子串.注:该题只读入A和B,不读入长度,先读入A,再读入B.数据保证A和B中只含小写字母 ...

  9. Codeforces 1015F Bracket Substring AC自动机 + dp

    Bracket Substring 这么垃圾的题怎么以前都不会写啊, 现在一眼怎么就会啊.... 考虑dp[ i ][ j ][ k ][ op ] 表示 已经填了 i 个空格, 末尾串匹配到 所给串 ...

最新文章

  1. Apache Ignite本机持久性,简要概述
  2. 技术动态 | 清华大学开源OpenKE:知识表示学习平台
  3. 云原生数据库如何打造业务弹性
  4. linux恢复终端默认配置,以gnome-terminal为例,修改gnome3 的默认配置,
  5. 理解 python 装饰器
  6. python安装的模块在pycharm中能用吗_pycharm安装python模块
  7. NSString copy or not (strong)?
  8. electron 自定义标题栏_electron+vue制作桌面应用--自定义标题栏
  9. 【2019牛客暑期多校训练营(第八场)E】Explorer【线段树分治维护图连通】
  10. struts1 和struts 2区别
  11. 6070. 计算字符串的数字和
  12. Enterprise Architect:绘制基本包图(详细步骤)
  13. 工银亚洲见证开户详细过程和攻略
  14. 执行若依(ruoyi)项目
  15. 解决:el-input添加clearable属性后出现2个×清除图标
  16. MXC极域,被严重低估的未来物联网
  17. OpenSSL 生成证书
  18. vue使用最新版font-awesome字体图标库(内附花式玩法)
  19. 哪位前端大神可以帮我看一下我的问题
  20. Microsoft Visual C++Build Tools安装包丢失或损坏【解决方案】

热门文章

  1. PIC单片机入门_异步通讯模式详解
  2. C#中线程池的简单应用
  3. 7种CSS圆角框解决方案
  4. cordova自定义一个简单的alert的插件(android平台)
  5. tomcat设置监听端口以及设置运行环境
  6. dokuwiki 的管理和使用(补充)
  7. 关于汇编跟C/C++已经java的内存理解
  8. 动态规划和贪心算法的区别
  9. 如何修改linux的MAC地址
  10. Java绘图模式概述