[洛谷P4052][JSOI2007]文本生成器
题目大意:有$n$个字符串$s_i$,问有多少个长度为$m$的字符串至少包含$n$个字符串中的一个,字符集 A-Z 。$s_i,m\leqslant100,n\leqslant60$
题解:$AC$自动机上$DP$,转换问题为求有多少个长度为$m$的字符串不包含$n$个字符串中的任意一个。定义$f[i][j]$表示现在字符串长度为$i$,匹配到了$AC$自动机上的点$j$且没有出现$n$个字符串中的任意一个的方案数,发现$f[i][j]$可转移到$f[i+1][nxt[j][k]]$。注意,要求$nxt[j][k]$不能是一个串的结尾。可以发现若$nxt[j][k]$的$fail$中没有串的结尾就是合法的,这一个可以在求$fail$时顺带求出
卡点:无
C++ Code:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
const int maxn = 110 * 60, mod = 10007;
inline void reduce(int &x) { x += x >> 31 & mod; } int n, m, ans = 1; namespace AC {
int nxt[maxn][26], fail[maxn], idx = 1;
bool End[maxn];
void insert(std::string s) {
int p = 1;
for (char ch : s) {
if (nxt[p][ch - 'A']) p = nxt[p][ch - 'A'];
else p = nxt[p][ch - 'A'] = ++idx;
}
End[p] = true;
}
void build() {
static std::queue<int> q;
for (int i = 0; i < 26; ++i)
if (nxt[1][i]) fail[nxt[1][i]] = 1, q.push(nxt[1][i]);
else nxt[1][i] = 1;
while (!q.empty()) {
int u = q.front(); q.pop();
for (int i = 0; i < 26; ++i)
if (nxt[u][i]) {
fail[nxt[u][i]] = nxt[fail[u]][i];
End[nxt[u][i]] |= End[fail[nxt[u][i]]];
q.push(nxt[u][i]);
} else nxt[u][i] = nxt[fail[u]][i];
}
} void solve() {
static std::queue<int> q[2];
int f[111][maxn], tg[maxn];
int now = 1, pst = 0, u;
q[now].push(1);
f[0][1] = 1;
for (int i = 0; i < m; ++i) {
std::swap(now, pst);
while (!q[pst].empty()) {
u = q[pst].front(), q[pst].pop();
for (int j = 0; j < 26; ++j)
if (!End[nxt[u][j]]) {
reduce(f[i + 1][nxt[u][j]] += f[i][u] - mod);
if (tg[nxt[u][j]] != i + 1) q[now].push(nxt[u][j]);
tg[nxt[u][j]] = i + 1;
}
}
}
for (; !q[now].empty(); q[now].pop())
reduce(ans -= f[m][q[now].front()]);
}
} int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
std::cin >> n >> m;
for (int i = 1; i <= m; ++i) ans = ans * 26 % mod;
for (int i = 0; i < n; ++i) {
static std::string s;
std::cin >> s;
AC::insert(s);
}
AC::build(), AC::solve();
std::cout << ans << '\n';
return 0;
}
[洛谷P4052][JSOI2007]文本生成器的更多相关文章
- 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp
正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...
- 洛谷P4052 [JSOI2007]文本生成器(AC自动机)
传送门 好像这题的确只能用AC自动机做了……Aufun大佬太强啦 正着难我们反着做,用总共单词个数减去没有一个单词都不包含的 然后考虑怎么处理一个单词都不包含的,就是跑不到单词的结尾节点 定义$f[i ...
- 落谷 P4052 [JSOI2007]文本生成器
题目链接.只要有一个可读就行,容斥会好做一点. 可读数量 \(=\) 总数 \(-\) 不可读数量 总数显然是 \(26 ^ n\). 求解不可读数量 不可读数量可以利用 AC 自动机的模型进行 DP ...
- P4052 [JSOI2007]文本生成器
P4052 [JSOI2007]文本生成器 AC自动机+dp 优秀题解传送门 设f[ i ][ j ]表示串的长度为 i ,当前在 j 点时不可识别的串的方案数 最后用总方案数减去不可识别方案数就是答 ...
- 2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP)
2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP) https://www.luogu.com.cn/problem/P4052 题意: JSOI 交给队员 ZYX ...
- BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3953 Solved: 1614[Submit][Stat ...
- bzoj1030 [JSOI2007]文本生成器
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2654 Solved: 1100[Submit][Stat ...
- JSOI2007文本生成器
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1613 Solved: 656[Submit][Statu ...
- BZOJ 1030 [JSOI2007]文本生成器
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2624 Solved: 1087[Submit][Stat ...
随机推荐
- 机器学习---朴素贝叶斯与逻辑回归的区别(Machine Learning Naive Bayes Logistic Regression Difference)
朴素贝叶斯与逻辑回归的区别: 朴素贝叶斯 逻辑回归 生成模型(Generative model) 判别模型(Discriminative model) 对特征x和目标y的联合分布P(x,y)建模,使用 ...
- 【字符串】后缀数组SA
后缀数组 概念 实际上就是将一个字符串的所有后缀按照字典序排序 得到了两个数组 \(sa[i]\) 和 \(rk[i]\),其中 \(sa[i]\) 表示排名为 i 的后缀,\(rk[i]\) 表示后 ...
- ELK:使用docker搭建elk平台
1.安装ElasticSearch 1.docker pull elasticsearch //拉取镜像 2.find /var/lib/docker/overlay2/ -name jvm.opti ...
- 如果要对img里面的值做特殊处理,可以直接写方法
html <img :src="getMore('up')" alt=""> data里面定义的 one: 'http://p1.fishqc.ne ...
- 刷题记录:[LCTF]bestphp's revenge
目录 刷题记录:[LCTF]bestphp's revenge 一.知识点 1.SoapClient触发反序列化导致ssrf 2.serialize_hander处理session方式不同导致sess ...
- hdu4841 圆桌问题[STL vector]
目录 题目地址 题干 代码和解释 参考 题目地址 hdu4841 题干 代码和解释 解本题时使用了刚学的STL vector,注意hdu不支持万能头文件#include<bits/stdc++. ...
- 图像基础知识之YUV
一.YUV常用格式 YUV是编译true-color颜色空间(color space)的种类,Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠.“Y”表示明亮度(L ...
- Base64(2)
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncoding ...
- 机动车驾驶(1)--- 禁令标志汇总 by John
以下是普通标志牌(新车安全)
- robot:当用例失败时执行关键字(发送短信)
使用场景: 当用例失败时需要通知对应人员,则需要在Teardown中,使用关键字Run Keyword If Test Failed Send Message关键字为自定义关键字,${content} ...