题目传送门

题意:训练指南P217

分析:没有模板串也就是在自动机上走L步,不走到val[u] == v的节点的概率

PS:边读边insert WA了,有毒啊!

#include <bits/stdc++.h>
using namespace std; const int K = 20 + 5;
const int L = 100 + 5;
const int NODE = K * K;
const int SIZE = 66;
int idx[256], n;
struct AC {
int ch[NODE][SIZE], fail[NODE], match[NODE], sz;
void clear(void) {
memset (ch[0], 0, sizeof (ch[0]));
sz = 1;
}
void insert(char *P) {
int u = 0, lenp = strlen (P);
for (int c, i=0; i<lenp; ++i) {
c = idx[P[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 build(void) {
queue<int> que; fail[0] = 0;
int u;
for (int c=0; c<SIZE; ++c) {
u = ch[0][c];
if (u) {
fail[u] = 0; que.push (u);
}
}
while (!que.empty ()) {
int r = que.front (); que.pop ();
for (int c=0; c<SIZE; ++c) {
int u = ch[r][c];
if (!u) {
ch[r][c] = ch[fail[r]][c]; continue;
}
que.push (u);
int v = fail[r];
while (v && !ch[v][c]) v = fail[v];
fail[u] = ch[v][c];
match[u] |= match[fail[u]];
}
}
}
}ac; double prob[SIZE];
bool vis[NODE][L];
double dp[NODE][L];
double DFS(int u, int len) {
if (!len) return 1.0;
if (vis[u][len]) return dp[u][len];
vis[u][len] = true;
double &ret = dp[u][len];
ret = 0;
for (int i=0; i<n; ++i) {
if (!ac.match[ac.ch[u][i]]) ret += prob[i] * DFS (ac.ch[u][i], len - 1);
}
return ret;
}
char pattern[30][30];
//char pattern[30]; int main(void) {
int T, cas = 0; scanf ("%d", &T);
while (T--) {
//char pattern[30];
ac.clear ();
int k; scanf ("%d", &k);
for (int i=1; i<=k; ++i) {
scanf ("%s", &pattern[i]);
//scanf ("%s", &pattern);
//ac.insert (pattern);
}
//ac.build ();
scanf ("%d", &n);
char str[3];
for (int i=0; i<n; ++i) {
scanf ("%s%lf", &str, &prob[i]);
idx[str[0]] = i;
}
for (int i=1; i<=k; ++i) ac.insert (pattern[i]);
ac.build ();
int len; scanf ("%d", &len);
memset (vis, false, sizeof (vis));
printf ("Case #%d: %.6lf\n", ++cas, DFS (0, len));
} return 0;
}

  

最新文章

  1. JVM的生命周期、体系结构、内存管理和垃圾回收机制
  2. &lt;context-param&gt;与&lt;init-param&gt;
  3. poj3301Texas Trip(三分)
  4. HDU 3401 Trade dp+单调队列优化
  5. php用jquery-ajax上传多张图片限制图片大小
  6. java命令行HPROF Profiler
  7. Tomcat的SessionID引起的Session Fixation和Session Hijacking问题
  8. dede版权信息修改
  9. c++ new带括号和不带括号
  10. javascript表单行为效果展示
  11. PAT (Advanced Level) 1074. Reversing Linked List (25)
  12. 0_Simple__cdpSimplePrint + 0_Simple__cdpSimpleQuicksort
  13. Spring的IOC注解开发入门1
  14. 解决zabbix3.4图表显示中文乱码问题
  15. 用docker快速搭建wordpress博客
  16. highcharts插件
  17. vue组件定义全局方法
  18. django之ForNode是如何渲染的
  19. 蓝魔i7s刷机
  20. bzoj 4034: [HAOI2015]树上操作 (树剖+线段树 子树操作)

热门文章

  1. IOS - 内购
  2. php原型模式的研究
  3. [Android] 查看Android中的AlarmManager事件
  4. August 12th 2016 Week 33rd Friday
  5. 43个优秀的Swift开源项目
  6. 关于HTML5在动画制作工具Animatron的一些问题
  7. Javaweb---Servlet过滤器
  8. MyEclipse破解(MEGen.java)
  9. 数据结构和算法 &ndash; 11.高级排序算法(下)
  10. PHP中比较两个时间的大小与日期的差值