题意就是给你几个模板串,以及一些字符的出现概率,随机选择字符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. 并查集-----好忧伤的并查集
  2. Spark详解(十二):Spark Streaming原理和实现
  3. Linux 设置windows可见的文件夹共享,创建只拥有读权限的共享用户,samba工具安装,“smbpasswd: command not found“问题解决
  4. ffplay.c学习-7-以音频同步为基准
  5. 如何用Postman做接口测试
  6. mysql中对比月_详解Mysql中日期比较大小的方法
  7. Visual C#.Net网络程序开发-Tcp篇(1)
  8. JPA结合querydsl使用
  9. 鱼眼相机矫正,按经纬度展开为环视图
  10. python 爬取全国最新省市区数据,并存入表
  11. 江苏大学毕业论文答辩PPT模板
  12. mac无法验证您网络上的打印机,怎么解决?
  13. SQL三个表关联查询
  14. 苹果4S恢复模式 一直正在等待iphone解决办法
  15. 奥特曼系列ot中怎么选择服务器,《奥特曼系列OL》新手攻略(另外一篇)
  16. pin ——pin tool代码注释 各pin tool的用途
  17. 超级账本hyperledger fabric第五集:共识排序及源码阅读
  18. 恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记4——ADC
  19. 研究生被导师嫌弃是种怎样的体验?写的太真实了...
  20. 我的世界服务器物品在护甲,我的世界满级护甲指令,我的世界召唤盔甲架指令...

热门文章

  1. T06-Linux创建用户和用户组
  2. ubuntu 16.04 桌面修复
  3. 绿联硬盘盒挂载linux,绿联sata硬盘盒,2.5/3.5寸外置usb3.0移动硬盘盒
  4. js的lambda表达式
  5. ARTIX-7 XC7A35T实验项目之流水灯
  6. markdown图片旋转
  7. java 构造方法能被继承吗_Java中构造函数可以被继承么
  8. word 多级标题的编辑
  9. sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表
  10. Excel如何批量对一列添加单引号