不包含任何模式串的字符串个数

题目描述

生成一个长度为 n,字符集为 Σ 的字符串 S .

给定若干模式串 s1m,要求 S 中不能有任何一个子串为模式串 .

问字符串 S 的个数 .

答案对 P 取模,P 不超过 231 .

数据范围:

  • Task 1. n60m100|s|100JSOI2007 文本生成器) .
  • Task 2. n109m20|s|20HNOI2008 GT考试 加强版) .

|Σ|10 .

咋做

首先建出模式串的 AC 自动机(不妨记转移函数为 trans) .

考虑 DP,令 dpi,j 表示串长为 i,在 AC 自动机上走到编号为 j 的节点的合法串个数 .

则在 AC 自动机上走一步即可完成转移:

dpi+1,trans(j,c)=dpi,j(cΣ)

暴力 DP,时间复杂度 O(|Σ|n|s|) .

大概这么写:

dp[0][0] = 1;
for (int i=0; i<n; i++)
	for (int j=0; j<=cc; j++)
		for (int k=0; k<Sig; k++)
			if (!mark[tr[j][k]]) dp[i+1][tr[j][k]] = (dp[i+1][tr[j][k]] + dp[i][j]) % P;

Task 1 完美解决 .

然而我们发现 i 这个玩意和内层转移几乎没关系,只是为了保证转移顺序 .

也就是说这玩意相当于进行了 i 次内层转移,i 一维枚举根本没用 .

所以我们构建出内层转移矩阵,然后快速幂即可 .

设 AC 自动机大小为 c,则 DP 部分时间复杂度为 O(c3logn) .

Task 2 完美解决 .

posted @   yspm  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示