AC自动机在线版本(alert命中报警)

news/2025/9/25 22:47:11/文章来源:https://www.cnblogs.com/xdhking/p/19112244

模板洛谷p3311

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
// 常量定义:N为AC自动机状态数上限、数位DP位数上限;mod为答案取模值
const int N=2010,mod=1e9+7;// AC自动机核心数组:
// tr[状态][数字] = 下一个状态(转移表);fail[状态] = 失败指针;idx为状态计数器
int tr[N][10],fail[N],idx;
// alert[状态]:标记该状态是否对应包含禁忌子串(含fail链继承的禁忌)
bool alert[N];// 数位DP相关变量:
// m为禁忌串数量;d[位]:存储数字n的每一位(从低位到高位);have0标记是否有禁忌串"0"
int m,d[N],have0;
// dp[当前位][AC自动机状态]:记忆化存储“当前处理到第pos位,AC状态为cur,无限制且无前导零”时的合法数个数
LL dp[N][N];// 功能:将单个禁忌串插入AC自动机
// 参数:s为待插入的禁忌数字串
void insert(string& s){int cur=0; // 从AC自动机根节点(状态0)开始for(char& ch:s){ // 遍历禁忌串的每个字符int path=ch-'0'; // 将字符转为数字(0-9),作为转移路径if(!tr[cur][path]) // 若当前状态cur没有path方向的子节点,创建新状态tr[cur][path]=++idx;cur=tr[cur][path]; // 转移到下一个状态}alert[cur]=true; // 标记当前状态(禁忌串结尾)为“含禁忌子串”
}// 功能:初始化AC自动机的失败指针(BFS实现),构建fail链
void init(){queue<int> q; // BFS队列,存储待处理的AC状态// 初始化队列:将根节点(状态0)的所有直接子节点加入队列for(int i=0;i<10;i++){if(tr[0][i]){ // 若根节点有数字i方向的子节点q.push(tr[0][i]);}}while(q.size()){ // BFS循环处理每个状态int u=q.front(); // 取出队首状态uq.pop();for(int i=0;i<10;i++){ // 遍历u的所有可能转移方向(0-9)if(tr[u][i]){ // 情况1:u有数字i方向的子节点// 子节点的失败指针 = u的失败指针在i方向的转移状态fail[tr[u][i]]=tr[fail[u]][i];// 子节点是否含禁忌 = 自身是否禁忌 或 失败指针指向的状态是否禁忌(继承fail链的禁忌)alert[tr[u][i]]|=alert[fail[tr[u][i]]];q.push(tr[u][i]); // 将子节点加入队列,后续处理}else{ // 情况2:u无数字i方向的子节点,路径压缩(直接指向fail链的转移结果)tr[u][i]=tr[fail[u]][i];}}}
}// 功能:数位DP记忆化搜索,统计“当前状态下合法的数字个数”
// 参数:
// pos:当前处理的位数(从高位到低位,最终到0位结束)
// limit:是否受原数字n的当前位限制(true=只能填≤n的当前位,false=可填0-9)
// zero:是否处于前导零状态(true=前面全是0,当前填0仍为前导零,false=已出现非零数字)
// cur:当前在AC自动机中的状态(跟踪是否包含禁忌子串)
LL dfs(int pos,bool limit,bool zero,int cur){if(pos==0){ // 递归终止:处理完所有位,计数1个合法数字(空串/已形成完整数字)return 1;}// 记忆化复用:若“无限制、无前导零、状态已计算过”,直接返回存储的结果if(!limit&&!zero&&~dp[pos][cur])return dp[pos][cur];// 确定当前位的最大可填数字:受限时为n的当前位(d[pos]),否则为9int up=limit?d[pos]:9;LL ret=0; // 存储当前状态下的合法数个数for(int i=0;i<=up;i++){ // 遍历当前位可填的所有数字(0到up)int tmp=tr[cur][i]; // 计算当前数字i对应的AC状态转移结果if(i==0&&zero) // 若当前是前导零且填0,AC状态保持根节点(0)(避免前导零计入禁忌判断)tmp=0;if(alert[tmp]) // 若当前AC状态含禁忌子串,跳过该数字(不合法)continue;// 递归处理下一位:// 新limit = 原limit且当前填的数字等于up(仍受限制)// 新zero = 原zero且当前填的数字等于0(仍为前导零)// 新cur = 计算出的AC状态tmp(ret+=dfs(pos-1,limit&&(i==d[pos]),zero&&(i==0),tmp))%=mod;}// 记忆化存储:仅当“无限制、无前导零”时,保存当前状态的结果(后续可复用)if(!limit&&!zero)dp[pos][cur]=ret;return ret;
}// 功能:计算“0到n之间所有不含禁忌子串的数字个数”
// 参数:s为原数字n的字符串形式
LL calc(string &s){memset(dp,0xff,sizeof(dp)); // 初始化记忆化数组为-1(标记未计算)int len=s.size(); // 原数字n的位数// 将字符串s的数字从后往前存入d数组(d[1]是个位,d[len]是最高位)// 目的:配合数位DP从高位(pos=len)到低位(pos=1)的处理顺序for(int i=len-1,j=1;i>=0;i--,j++){d[j]=s[i]-'0';}// 调用DFS:从最高位(len)开始,初始状态为“受限制、前导零、AC根节点”return dfs(len,1,1,0)%mod;
}int main(){// 关闭同步,加速cin输入(处理大输入时有效)cin.tie(nullptr)->sync_with_stdio(false);string n; // 存储原数字n(字符串形式,应对超大数据)cin>>n;cin>>m; // 读取禁忌串的数量for(int i=1;i<=m;i++){ // 遍历每个禁忌串string s;cin>>s;insert(s); // 插入AC自动机if(s=="0") // 标记是否存在禁忌串“0”(后续用于判断是否需扣除0的计数)have0=1;}init(); // 初始化AC自动机的失败指针// 计算最终答案:// calc(n) = 0~n的合法数个数;!have0 = 0是否合法(1=合法,0=非法)// 题目要求“不大于n的正整数”,需扣除0的计数(若0合法)cout<<(calc(n)-!have0+mod)%mod<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

US$79 BMW FEM/BDC Key Programmer Data Desktop Test Platform for FEM/BDC Key and Program ECU Gearbox

BMW FEM/BDC Key Programmer Data Desktop Test Platform for FEM/BDC Key and Program ECU GearboxFEM BDC Module Testing Platform for BMW F20 F30 F35 X5 X6 I3With your FEM/BDC keys, FEM BDC Module Testing P…

week1 homework

C语言代码规范 参考了大公司的标准 1、程序采用缩进风格,每层缩进使用一个制表位(TAB) 2、源程序使用英文书写,尽量不含有中文。 3、左花括号要另起一行,不能跟在上一行的行末; 4、一个变量定义占一行,一个语句…

(南科大深度学习课程笔记)Lecture_2_Mathematical background(数学背景)(上) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

app那个网站开发比较好xp优化大师

Serverless 话题涉及范围极广&#xff0c;几乎包含了代码管理、测试、发布、运维和扩容等与应用生命周期关联的所有环节。在线应用如何不改代码也能迁移到 Serverless 架构&#xff1f;今天&#xff0c;我们来揭秘阿里巴巴成千上万在线应用的Serverless 演进过程。 AWS Lambda …

最牛网站建设是谁装饰公司办公室图片

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 什么是WebSocket&#xff1f; WebSocket是一种在Web应用程序中实现双向通信的协议。它允许在客户端和服务器之间建立持久…

Java EE ----- Spring MVC (上) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

秦皇岛网站排名郑州手机网站制作公司哪家好

可以删一下 按住alt按移除可以删掉 选择你要删的那些线 按住alt点移除

浦东做网站如何在社交网站做销售

一、介绍部分 (win7 下的 GUI 效果图见 本篇文章的最后部分截图2张)wxWidgets是一个开源的跨平台的C构架库(framework)&#xff0c;它可以提供GUI(图形用户界面)和其它工具。目前的2.x版本支持所有版本的Windows、带GTK或Motif的Unix和MacOS。相当于大家熟悉的 VC。二、wxWidge…

Windows 10 C盘占用释放 - tfel

C盘又要撑爆...前言 安装的Windows 10 LSTC, 系统盘留了 200G 最近发现可用只剩下50G, 甚至还在减少 排查 使用 SpaceSniffer 看下具体占用 好用,到Windows 10我也觉得它装机必备!!!占用大头 网易云音乐 缓存它默认…

CherryStudio+cpolar:让智能工作流突破组织边界 - 详解

CherryStudio+cpolar:让智能工作流突破组织边界 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

科学计算方法--矩阵分析记录

1. 前言砚上三五笔,落墨鹧鸪啼本文用于记录:科学计算方法--矩阵分析记录 最近有点忘记矩阵了(汗),这里记录一下。 如有不对,欢迎评论区指正! 2. 正文 2.1 矩阵(matrix) 矩阵理解为空间中的一种变换,作用到对…

window.addEventListener(message,()={})中的回调函数无故被一直触发的问题 - broky

遇到的问题使用第一个进入无痕模式就没有被一直触发的问题了 一、最可能的 3 个 “隐式消息发送源”(非你主动写的代码)浏览器插件 / 扩展程序发送的消息 很多浏览器插件(如广告拦截、翻译、开发者工具插件)会通过…

建设单位网站设计有了公网ip如何做网站

盒模型是界面布局需要掌握的基本功。盒模型基本概念 盒模型四要素&#xff1a;margin、border、padding、content。 盒模型分为&#xff1a;标准盒模型&#xff08;W3C盒模型&#xff09; 、 怪异盒模型&#xff08;IE盒模型&#xff09; 盒模型区别 怪异盒模型总宽度 content…

做网站包括什么网站备案的意思

list: quert.list()方法会将从数据库查找到的数据库放到一级缓存和二级缓存,但是不能从一级和二级缓存读取数据,但是可以从二级缓存的查询缓存读取数据, iterate: quert.iterate()方法总会先查找数据表的主键,然后根据每一个主键发送对应的sql语句从数据库读取数据,它可以把数据…

iis7重启 网站河南网站建设服务公司

当然&#xff0c;可以使用 Python 编写一个简单的程序来查找给定列表中的最大和最小值。以下是一个示例程序&#xff1a; def find_max_min(values):if not values: # 检查列表是否为空return None, Nonemax_value values[0]min_value values[0]for value in values:if val…

大连哪家公司做网站桃源网站建设

一、引言 在信息爆炸的时代,网络上蕴含着海量的数据。如果我们想要获取特定的信息,手动从网页上复制粘贴显然效率极低。这时,Web 爬虫就派上了用场。Web 爬虫是一种自动获取网页内容的程序,它可以模拟人类在浏览器中的操作,快速地抓取网页上的数据。本文将带领大家使用 Py…

新风向网站建设邢台县建设局网站

注&#xff1a;这一节的课程分为对已经从业产品经理业务转型的人群和想要进入到AI产品行业的人群两部分&#xff0c;我这里针对自己的情况只说明了第二部分&#xff0c;如果有需要了解其他的成长路径方式的朋友请自行观看刘老师的课程。 1.持续了解AI行业 你需要持之以恒的了…

精简网站模板适合个人做的网站

web 框架使用路由技术来帮助用户记住应用程序的 url。无需从主页导航即可直接访问所需页面。 route() 装饰器用于将 url 绑定到函数&#xff1a; app.route(/hello) def hello_world(): return hello world url /hello 规则绑定到 hello_world() 函数。如果用户访问 url :…

python+pillow+Image实现图片压缩到指定大小

本次使用的是python 3.6先安装 pip install pillow from PIL import Imageimport osimg_path = r"H:\pythonworkspace\test\a.jpg"img_path_2 = r"H:\pythonworkspace\test\test.jpg"# 下面这种…

页面卡顿问题分析与解决方案总结复盘

页面卡顿的本质是浏览器无法在16.7毫秒内完成一帧的渲染工作(以达到60FPS的流畅度)。问题根源可归为两大类:CPU计算瓶颈和I/O等待瓶颈。一、 CPU瓶颈(主线程过载)根本原因: JavaScript是单线程的。主线程负责执行…