UVA-11468 Substring(AC自动机+DP)
题目大意:给一些模板串,一些字符的出现概率。问不会出现模板串的概率是多少。
题目分析:是比较简单的概率DP+AC自动机。利用全概率公式递推即可。
代码如下:
# include<iostream>
# include<cstdio>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std; const int N=1000; int ch[N+5][65];
int cnt;
bool match[N+5];
int f[N+5];
char str[65][5];
double pi[65];
double dp[N+5][105];
bool vis[N+5][105]; void init()
{
cnt=0;
memset(pi,0,sizeof(pi));
memset(ch,0,sizeof(ch));
memset(match,false,sizeof(match));
} int idx(char c)
{
if(c>='0'&&c<='9') return c-'0';
if(c>='a'&&c<='z') return c-'a'+10;
return c-'A'+36;
} void insert(string s)
{
int n=s.size();
int root=0;
for(int i=0;i<n;++i){
int c=idx(s[i]);
if(!ch[root][c]) ch[root][c]=++cnt;
root=ch[root][c];
}
match[root]=true;
} void getFail()
{
queue<int>q;
f[0]=0;
for(int i=0;i<62;++i){
int u=ch[0][i];
if(!u) continue;
f[u]=0;
q.push(u);
}
while(!q.empty())
{
int root=q.front();
q.pop();
for(int i=0;i<62;++i){
int u=ch[root][i];
if(!u){
ch[root][i]=ch[f[root]][i];
continue;
}
q.push(u);
int v=f[root];
while(v&&!ch[v][i]) v=f[v];
f[u]=ch[v][i];
match[u]|=match[f[u]];
}
}
} double dfs(int u,int L)
{
if(vis[u][L]) return dp[u][L];
vis[u][L]=true;
if(L==0) return dp[u][L]=1.0;
double &ans=dp[u][L];
ans=0.0;
for(int i=0;i<62;++i) if(!match[ch[u][i]])
ans+=pi[i]*dfs(ch[u][i],L-1);
return ans;
} int main()
{
//freopen("in.txt","r",stdin);
int T,n,m,L,cas=0;
scanf("%d",&T);
while(T--)
{
init();
scanf("%d",&n);
string p;
for(int i=0;i<n;++i){
cin>>p;
insert(p);
}
getFail();
scanf("%d",&m);
double pp;
for(int i=0;i<m;++i){
scanf("%s%lf",str[i],&pp);
pi[idx(str[i][0])]=pp;
}
scanf("%d",&L);
memset(vis,false,sizeof(vis));
printf("Case #%d: %.6lf\n",++cas,dfs(0,L));
}
return 0;
}
UVA-11468 Substring(AC自动机+DP)的更多相关文章
- UVa 11468 Substring (AC自动机+概率DP)
题意:给出一个字母表以及每个字母出现的概率.再给出一些模板串S.从字母表中每次随机拿出一个字母,一共拿L次组成一个产度为L的串, 问这个串不包含S中任何一个串的概率为多少? 析:先构造一个AC自动机, ...
- UVA 11468【AC自动机+DP】
dp[i][j]表示走了i步走到j结点的概率.初始值dp[0][0] = 1.当走到的结点不是单词尾结点时,才能走过去. !end[i]&&last[i] == root时,该结点才可 ...
- uva 11468 - Substring(AC自己主动机+概率)
题目链接:uva 11468 - Substring 题目大意:给出一些字符和各自字符相应的选择概率.随机选择L次后得到一个长度为L的字符串,要求该字符串不包括随意一个子串的概率. 解题思路:构造AC ...
- Codeforces 1015F Bracket Substring AC自动机 + dp
Bracket Substring 这么垃圾的题怎么以前都不会写啊, 现在一眼怎么就会啊.... 考虑dp[ i ][ j ][ k ][ op ] 表示 已经填了 i 个空格, 末尾串匹配到 所给串 ...
- 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 ...
随机推荐
- 凭借K2 SmartObject框架,在SharePoint中集成数据
随着SharePoint 2013的发布,Microsoft已提供Business Connectivity Services(BCS)增强功能以及外部列表功能,确保您可以更简单地在SharePoin ...
- 解决VS2010控制台程序运行结束不显示请按任意键继续
在VS2010里的控制台应用程序在运行时,结果画面一闪而过,不管是用F5 还是用Ctrl + F5都是一样,导致无法看到结果. 网上有不少的办法,说是都是在程序最后加一个要程序暂停的语句( syste ...
- (kate)win8-64位系统下opencv-2.4.3的安装以及在visual_studio2010中配置
环境: 操作系统:window8.1 64bit Opencv版本:OPencv-2.4.3 VS版本:vs 2010 一.安装Opencv 1.Opencv官网http://opencv.org/ ...
- mybatis写mapper文件注意事项(转)
原文链接:http://wksandy.iteye.com/blog/1443133 xml中某些特殊符号作为内容信息时需要做转义,否则会对文件的合法性和使用造成影响 < < > & ...
- java应用程序和虚拟机实例之间的关系
每一个java程序都会产生一个java虚拟机的实例.并不是说一个物理机上,运行多个java应用程序就只有一个java虚拟机实例,多少个java应用程序就有多少个java虚拟机实例.
- 使用respondsToSelector:来发现对象是否响应消息
发现对象是否响应消息 要发现一个对象是否响应一则消息,请在该对象上调用 respondsToSelector: 方法.应用程序代码通常验证一个对象响应一则消息后,才将消息发送给该对象. if ([it ...
- Interview----用最快的方法计算 Fibonacci 数
输入 n, 用最快的方法求该 Fibocacci 数列的第 n 项. 方法1: 递归,非常慢 方法2: 迭代,因此计算 f[1] , f[2], f[3] ,,,, 复杂度 O(N) 方法3: 采用以 ...
- 关于EOF的种种。
EOF读取数据是读取一个向下进行一次,知道没有数据可以读取. EOF的使用,用while和eof的
- 我与python3擦肩而过(一)—— Dict与collections.OrderredDict邂逅
最近一直在撸Python Data Analysis上的代码(书是基于Python2的,小白我用的python3),所以我下的时候多少有些改动. 这是9.4中的nltk词频分析关于Dict_key的问 ...
- HTML的常用标签
<!--编写HTML常用的标签 文字版面的编辑 格式标签 文本标签 超链接和锚点 图像和图像地图 --> <!DOCTYPE html PUBLIC "-//W3C//DT ...