Hetao P3804 Cut 题解 [ 蓝 ] [ AC 自动机 ] [ 差分 ]

news/2025/1/12 19:04:59/文章来源:https://www.cnblogs.com/zhr0102/p/18667176

Cut:AC 自动机简单题。

image

image

思路

看见多个模式串以及求前缀,很显然能想到构建一个 AC 自动机。

那么在用 \(T\) 查询时,当前指针的深度就是该位置的最长前缀匹配长度。这个在字典树 insert 的时候就能求出来。

求出每一位的最长前缀后,因为这些部分都不能作为分割点,所以将这些区域用差分区间加,最后求出没有被加过的位置的个数 \(x\),答案即为 \(2^x\)。因为每个分割点可选可不选。

时间复杂度 \(O(n|\sum|)\)

注意 AC 自动机要 build 后再 query,不然你会和我一样虚空调试 10min。

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
const ll mod=998244353;
char t[1000005],s[1000005];
int n,ch[1000005][30],ne[1000005],dep[1000005],idx=0;
ll f[1000005],ans=1;
void insert(char *s)
{int p=0;for(int i=1;s[i];i++){int c=s[i]-'a';if(ch[p][c]==0)ch[p][c]=++idx;p=ch[p][c];dep[p]=i;}
}
void build()
{queue<int>q;for(int i=0;i<26;i++){if(ch[0][i])q.push(ch[0][i]);}while(!q.empty()){int u=q.front();q.pop();for(int i=0;i<26;i++){int v=ch[u][i];if(v)ne[v]=ch[ne[u]][i],q.push(v);else ch[u][i]=ch[ne[u]][i];}}
}
void query(char *s)
{int p=0;for(int i=1;s[i];i++){int c=s[i]-'a';p=ch[p][c];int len=dep[p];if(len){f[i]--;f[i-len+1]++;}}
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>t+1>>n;for(int i=1;i<=n;i++){cin>>s+1;insert(s);}build();query(t);int lt=strlen(t+1);for(int i=1;i<lt;i++){f[i]+=f[i-1];if(f[i]==0)ans=(ans*2)%mod;}cout<<ans;return 0;
}

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

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

相关文章

Lec 14 文件系统与设备

Lec 14 文件系统与设备License 本内容版权归上海交通大学并行与分布式系统研究所所有 使用者可以将全部或部分本内容免费用于非商业用途 使用者在使用全部或部分本内容时请注明来源 资料来自上海交通大学并行与分布式系统研究所+材料名字 对于不遵守此声明或者其他违法使用本内…

Java基础学习(七)

Java基础学习(七):异常机制 目录Java基础学习(七):异常机制概念简单分类异常体系结构异常处理机制自定义异常 本文为个人学习记录,内容学习自 狂神说Java概念异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等 异常发生在程序运行期…

24. 基于项的控件

一、基于项的控件PySide6 有专门的显示数据的控件和存储数据的模型,可以显示和存储不同形式的数据。显示数据的控件分为两类,一类是基于 项(item)的控件,另一类是基于 模型(model)的控件,基于项的控件是基于模型的控件的简便类。基于项的控件把读取到的数据存储到项中,…

杂题选记

杂题选记在网上天天划水刷面经,见到 teaser 就记下来。我的想法是,把 8L 倒入 3L,把 3L 倒入 5L,把 8L 倒入 3L,把 3L 倒入 5L,这时候三个瓶子分别有 1L(8L) 2L(3L) 5L(5L) 括号里面表示瓶子最开始的容量。这时候把 1L 水倒掉,把容积为 8L 的瓶子里面的 2L 水倒到 容积为…

pytorch算子调用过程:以rand算子为例

通过pytorch的torch.profiler带调用栈采集运行过程可以看到如下信息,通过chrome://tracing查看,图上每个小条条表示一个traceEvent, json中的信息如下图所示,其中cat表示traceEvent的类型,有cpu_op,python_function等,前者表示torch的cpp代码中定义的操作,后者表示pytorc…

Wordpress更换域名后,网站显示框架和加载问题解决

最近建立了一个站点,由于先使用ip进行网站搭建,经过一段时间备案完成后,需要转成域名。直接在Wordpress后台操作后,直接导致网页框架显示异常,排版错乱,大概就是主题的框架无法加载导致的。 搞了很久,包括恢复数据库和重新建站都是这样,最终发现是伪静态的问题。 我是使…

【Weblogic T3协议】反序列化漏洞分析(上)

免责声明 此文章中所涉及的技术、思路和工具仅供网络安全学习为目的,不得以盈利为目的或非法利用,否则后果自行承担!一、前言 在初入安全的时候,就听说过weblogic的大名,当然听说的并不是weblogic如何如何好用,而是因为其漏洞出现频率实在是有点高...于是乎,便抱着学习的…

关于安卓edge无法播放Wordpress上传的mp4视频问题

使用默认插件上传后,电脑端可以播放视频,其他手机浏览器均可播放视频,但是安卓edge无法加载视频。 大概是如下图样子:经查发现电脑打开页面会显示站点部分不安全的提示,说明edge端做了一些阻挡处理,导致视频无法播放。找了一些资料后,发现可以自行修改加载视频的代码框架…

【bt下载软件qBittorrent-增强版】下载链接

原作者github项目地址:https://github.com/c0re100/qBittorrent-Enhanced-Edition 找到当前的最新版本根据自身需要选择下载版本,这里选的是windows版本

鸟哥的Linux私房菜 基础学习篇 第四版PDF、EPUB免费下载

Linux入门书升级版,适用Linux系统应用和开发及运维的人员,涵盖linux内核,命令行,嵌入式,基于CentOS,7.x适读人群 :Linux初学者 适合Linux管理员作为参考手册 Linux入门书升级版,适用Linux系统应用和开发及运维的人员,涵盖linux内核,命令行,嵌入式,基于CentOS,7.x电…

领域驱动设计:软件核心复杂性应对之道(修订版)PDF、EPUB免费下载

本书是领域驱动设计方面的经典之作,修订版更是对之前出版的中文版进行了全面的修订和完善。全书围绕着设计和开发实践,结合若干真实的项目案例,向读者阐述如何在真实的软件开发中应用领域驱动设计。书中给出了领域驱动设计的系统化方法,并将人们普遍接受的一些实践综合到一…

JAVA之集合

1、集合集合可以存储引用数据类型; 集合不可以存储基本数据类型,若要存储,需封装成包装类;2、集合和数组的对比长度【数组长度固定,集合长度可变】 存储类型【数组可以存基本数据类型和引用数据类型,集合可以存引用数据类型,若存储基本数据类型,需封装成包装类】3、Arr…