题意就是给你几个模板串,以及一些字符的出现概率,随机选择字符L次后得到一个长度为L的字符串,问这个字符串不包括任何一个模板串的概率。

比较简单的题,把模板串构建成AC自动机,随机选择字符相当于在字典树里走一步,如果是单词节点处那么就不能走,或者走到没有点的位置,由于构造的是改造过的AC自动机所以直接由失配指针走到他下一个可能匹配的地方继续走。dp[i][j]代表还有i步要走,进入j节点的概率,记忆化搜索即可

AC代码:

//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<ctype.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdlib>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<ctime>
#include<string.h>
#include<string>
#include<sstream>
#include<bitset>
using namespace std;
#define ll __int64
#define ull unsigned long long
#define eps 1e-8
#define NMAX 1000000005
#define MOD 1000000007
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define PI acos(-1)
template<class T>
inline void scan_d(T &ret)
{char c;int flag = 0;ret=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c == '-'){flag = 1;c = getchar();}while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar();if(flag) ret = -ret;
}
double p[62];
const int SIGMA_SIZE = 62;
struct AhoCorasick
{int ch[20*25][SIGMA_SIZE];int match[20*25],f[20*25],vis[105][20*25];double dp[105][20*25];int sz;void init(){sz = 1; memset(ch[0],0,sizeof(ch[0]));memset(match,0,sizeof(match));memset(vis,0,sizeof(vis));}int idx(char c){if(islower(c)) return c-'a';else if(isupper(c)) return c-'A'+26;else return c-'0'+52;}void insert(char *s){int u = 0, n = strlen(s);for(int i = 0; i < n; i++){int c = idx(s[i]);if(!ch[u][c]){memset(ch[sz],0,sizeof(ch[sz]));match[sz] = 0;ch[u][c] = sz++;}u = ch[u][c];}match[u] = 1;}void getfail(){queue<int>q;f[0] = 0;for(int c = 0; c < SIGMA_SIZE; c++){int u = ch[0][c];if(u){f[u] = 0; q.push(u); }}while(!q.empty()){int r = q.front(); q.pop();for(int c = 0; c < SIGMA_SIZE; c++){int u = ch[r][c];if(!u){ch[r][c] = ch[f[r]][c];continue;}q.push(u);int v = f[r];while(v && !ch[v][c]) v = f[v];f[u] = ch[v][c];match[u] |= match[f[u]];}}}double dfs(int dep,int pos){if(dep == 0) return 1.0;if(vis[dep][pos]) return dp[dep][pos];vis[dep][pos] = 1;double &ans = dp[dep][pos];ans = 0;for(int i = 0; i < SIGMA_SIZE; i++) if(p[i] != 0.0){int u = ch[pos][i];if(!match[u]) ans += p[i]*dfs(dep-1,u);}return ans;}
};
AhoCorasick ac;
int main()
{
#ifdef GLQfreopen("input.txt","r",stdin);
//    freopen("o1.txt","w",stdout);
#endif // GLQint t,k,n,l,cas = 1;scanf("%d",&t);while(t--){ac.init();scanf("%d",&k);char tmp[25];for(int i = 0; i < k; i++){scanf("%s",tmp);ac.insert(tmp);}scanf("%d\n",&n);memset(p,0,sizeof(p));for(int i = 0; i < n; i++){char tp;double ha;scanf("%c %lf\n",&tp,&ha);p[ac.idx(tp)] = ha;}ac.getfail();scanf("%d",&l);printf("Case #%d: %.6lf\n",cas++,ac.dfs(l,0));}return 0;
}

UVA 11468 Substring(AC自动机+dp)相关推荐

  1. uva 11468 - Substring(AC自己主动机+概率)

    题目链接:uva 11468 - Substring 题目大意:给出一些字符和各自字符相应的选择概率.随机选择L次后得到一个长度为L的字符串,要求该字符串不包括随意一个子串的概率. 解题思路:构造AC ...

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

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

  3. uvalive4842(AC自动机+DP)

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

  4. HDU 2296 Ring AC自动机 + DP

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

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

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

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

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

  7. 2018北京ICPC H. Approximate Matching(AC自动机+DP)

    H : Approximate Matching 时间限制:1000ms,单点时限:1000ms,内存限制:512MB 描述 String matching, a common problem in ...

  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. 推荐一些顶级的开源CI/CD工具
  2. cocos2d-x游戏开发(十二)场景切换:滑门效果
  3. Mysql数据库常用指令
  4. jdbc mysql demo_JDBC_demo:java连接mysql过程
  5. 程序设计竞赛资源索引
  6. mybatis 业务逻辑
  7. 【中间件技术】软件构件与中间件技术学习与实践系列文章汇总目录(持续更新中)
  8. 25 逆波兰表达式、波兰表达式
  9. java tostring null_Java String转换时为null的问题
  10. C++ 后端开发工程师的技术栈整理
  11. 设备屏幕亮度调节代码实现
  12. Excel技巧 - Date函数日期转换
  13. fontTools库来检测字体文件中是否包含某字符
  14. 唐 库利超级计算机,第七卷 乖离性 百万亚瑟王_第二百五十二章 绝望中的希望...
  15. 通过css让图片设置成黑白色
  16. KubeSphere 内置的 Prometheus 通过 remote write 至 Thanos 存更长期数据
  17. 法坤老师:百度网盘密道转存12.0群文件自动转存发布咯
  18. 安装 libtorrent遇到问题
  19. 解决: 码云错误 You have successfully authenticated, but Gitee.com does not provide she access
  20. java servlet作用_Servlet的功能是什么

热门文章

  1. markdown图片旋转
  2. 侍魂胧月传说服务器维护,《侍魂胧月传说》2018年12月12日2:00进行全服停机更新维护...
  3. 帆软finereport导出excel的数字过长变成科学计数法的解决方法
  4. 怎样换通达信服务器文件夹,通达信的指标模版保存在那个文件夹,如何迁移
  5. excel表计算机实践操作,Excel电子表格计算机实践任务书
  6. unity触发时播放音效
  7. Air Pods用着怎么样?
  8. TIA博途中FC功能块的介绍与管脚定义
  9. el-table 表格展开与折叠
  10. PySpark 累加器使用及自定义累加器