博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects
阅读量:7005 次
发布时间:2019-06-27

本文共 1458 字,大约阅读时间需要 4 分钟。

 

题意:训练指南P250

分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 << m) - 1则是可能的。打印与之前相似。

#include 
using namespace std;typedef long long ll;const int N = 25 + 5;const int NODE = 10 * 10 + 5;const int M = (1 << 10) + 5;const int SIZE = 26;int n, m;char str[12];struct AC { int ch[NODE][SIZE], val[NODE], fail[NODE], last[NODE], sz; ll dp[NODE][N][M]; int out[N]; void clear(void) { memset (ch[0], 0, sizeof (ch[0])); sz = 1; } int idx(char c) { return c - 'a'; } void insert(char *s, int v) { int u = 0; for (int c, i=0; s[i]; ++i) { c = idx (s[i]); if (!ch[u][c]) { memset (ch[sz], 0, sizeof (ch[sz])); val[sz] = 0; ch[u][c] = sz++; } u = ch[u][c]; } val[u] |= (1 << v); } void build(void) { queue
que; fail[0] = 0; for (int c=0; c
0) { out[len] = c; print (ch[now][c], len + 1, st | val[ch[now][c]]); } } } ll DP(int now, int len, int st) { ll &ans = dp[now][len][st]; if (ans != -1) return ans; if (len == n) { if (st == (1 << m) - 1) return ans = 1; else return ans = 0; } ans = 0; for (int c=0; c

  

转载于:https://www.cnblogs.com/Running-Time/p/5221702.html

你可能感兴趣的文章