uva 11468 ac自动机+dp
来源:互联网 发布:net域名后缀排名高吗 编辑:程序博客网 时间:2024/04/27 13:11
题意:
求最后构成的长度为L的字符串不含有模式串的概率,没一个字符的概率已经给出来了。
思路:
自动机构造转移,然后dp[i][j]表示现在是第i步,在j这个状态。 转移方程就很好写了。
code:
#include <iostream>#include <queue>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int n;double m[1000];double dp[110][5110];int Next[5010][63],fail[5010],End[5010];struct Trie{ int root,L; int idx(char x){ if(x<='z' && x>='a') return x-'a'; if(x<='Z' && x>='A') return x-'A'+26; if(x<='9' && x>='0') return x-'0'+52; } int newnode() { for(int i = 0;i < 62;i++) Next[L][i] = -1; End[L++] = 0; return L-1; } void init() { L = 0; root = newnode(); } void insert(char buf[]) { int len = strlen(buf); int now = root; for(int i = 0;i < len;i++) { if(Next[now][idx(buf[i])] == -1) Next[now][idx(buf[i])] = newnode(); now = Next[now][idx(buf[i])]; } End[now] = 1; } void build() { queue<int>Q; fail[root] = root; for(int i = 0;i < 62;i++) if(Next[root][i] == -1) Next[root][i] = root; else { fail[Next[root][i]] = root; Q.push(Next[root][i]); } while( !Q.empty() ) { int now = Q.front(); Q.pop(); End[now] |= End[fail[now]]; for(int i = 0;i < 62;i++) if(Next[now][i] == -1) Next[now][i] = Next[fail[now]][i]; else { fail[Next[now][i]]=Next[fail[now]][i]; Q.push(Next[now][i]); } } } void query(){ memset(dp, 0, sizeof(dp)); dp[0][root] = 1; for(int i=0; i<=n; i++){ for(int j=0; j<L; j++){ for(int k=0; k<62; k++) if(End[Next[j][k]] == 0) dp[i+1][Next[j][k]] += dp[i][j]*m[k]; } } }};char tmp[40];int T;int main(){ Trie t; cin>>T; int icase = 0; while(T--){ memset(m, 0, sizeof(m)); int k; cin>>k; t.init(); for(int i=1; i<=k; i++){ scanf("%s", tmp); t.insert(tmp); } t.build(); cin>>n; double tt; for(int i=1; i<=n; i++){ scanf("%s %lf", tmp, &tt); m[t.idx(tmp[0])] = tt; } cin>>n; t.query(); double res = 0; for(int i=0; i<t.L; i++) res += dp[n][i]; printf("Case #%d: %.6f\n", ++icase, res); } return 0;}
0 0
- UVA 11468 Ac自动机+dp
- uva 11468 ac自动机+dp
- UVA 11468(Substring-AC自动机上dp)[Template:AC自动机]
- UVA 11468 Substring(AC自动机 + dp)
- UVA 11468-Substring(AC自动机+概率dp)
- UVA 11468 Substring(AC自动机+概率DP)
- UVa 11468 Substring AC自动机+概率DP
- UVA - 11468 Substring,AC自动机 + DP
- UVA 11468 Substring(AC自动机+dp)
- UVA 11468 Substring AC自动机+概率DP
- UVA - 11468(简单概率dp+ac自动机)
- UVA - 11468 Substring ( AC自动机 + dp)
- UVA 11468 Substring(AC自动机+概率DP)
- UVA 11468 —— Substring(AC自动机+DP)
- UVA 11468 - Substring (AC自动机 概率DP)
- uva 11468 ac自动机+概率DP+简单的数据生成器
- Uva 11468 Substring——AC自动机+概率DP
- UVA 1399 - Puzzle(AC自动机+DP)
- 【July程序员编程艺术】之字符串左旋
- Leetcode86: Missing Number
- [Poj1004]Financial Management
- android图片模糊的效果
- LP/QP/QCQP/SOCP/SDP/CCCP等系列优化方法的比较
- uva 11468 ac自动机+dp
- 新东西010--Android targetSdkVersion解析
- 【SQL优化】四月份培训的一个sql优化案例1
- linux安装vim
- GemFI安装中的'Error: can't find library -lpthread required by python'
- 黑马程序员---成长之路-----OC之基础篇创建对象
- first
- Halcon学习之2DMetrology
- 剑指offer—链表中环的入口结点