CF-GYM101741K. Consistent Occurrences
CF-GYM101741K. Consistent Occurrences
题意:给你一个长度为的串,以及次询问,每次给出一个串,询问在中最多出现了多少次(出现不能重叠)。
联想到前一题,我们可以将询问建树。
我们可以自然地想到,当匹配成功后,直接跳回根节点(就像kmp一样)。但是,由于是多串匹配,该算法假掉了。
这时候,我们看一道题:凌乱的yyy / 线段覆盖。
有人说,一道橙题,有什么好看的?
思想可以借鉴。
首先,每个匹配出来的出现位置,就相当于一条线段。而由于是顺序匹配,就默认左端点有序。因此,我们对于每个文本串,在这个内,不仅要存编号,也要存上一次出现的右端点与文本串长度。
则如果对于当前匹配的位置,有,则这条线段就可以被覆盖上。
代码:
void merge(){
int x=1;
for(int i=0;i<S;i++){
x=t[x].ch[s[i]-'a'];
for(int y=x;y!=1;y=t[y].fail)for(int j=0;j<t[y].fin.size();j++)if(t[y].fin[j].las<=i)res[t[y].fin[j].id]++,t[y].fin[j].las=i+t[y].fin[j].len;
}
}
(记录文本串长度是为了方便推出右端点)
并且,由于这题实在不好拓扑,就只写了暴力跳的程序(反正也能过)。
总代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,S,res[100100],cnt=1;
char s[100100],ss[100100];
struct Query{
int id,las,len;
Query(int x=0,int y=0,int z=0){
id=x,las=y,len=z;
}
};
struct AC_Automaton{
int ch[26],fail;
vector<Query>fin;
}t[100100];
void ins(int id){
int x=1;
for(int i=0;i<S;i++){
if(!t[x].ch[ss[i]-'a'])t[x].ch[ss[i]-'a']=++cnt;
x=t[x].ch[ss[i]-'a'];
}
t[x].fin.push_back(Query(id,0,S));
}
queue<int>q;
void build(){
for(int i=0;i<26;i++){
if(t[1].ch[i])t[t[1].ch[i]].fail=1,q.push(t[1].ch[i]);
else t[1].ch[i]=1;
}
while(!q.empty()){
int x=q.front();q.pop();
for(int i=0;i<26;i++){
if(t[x].ch[i])t[t[x].ch[i]].fail=t[t[x].fail].ch[i],q.push(t[x].ch[i]);
else t[x].ch[i]=t[t[x].fail].ch[i];
}
}
}
void merge(){
int x=1;
for(int i=0;i<S;i++){
x=t[x].ch[s[i]-'a'];
for(int y=x;y!=1;y=t[y].fail)for(int j=0;j<t[y].fin.size();j++)if(t[y].fin[j].las<=i)res[t[y].fin[j].id]++,t[y].fin[j].las=i+t[y].fin[j].len;
}
}
int main(){
scanf("%d%d",&n,&m);
scanf("%s",s);
for(int i=1;i<=m;i++)scanf("%s",ss),S=strlen(ss),ins(i);
build(),S=n;
merge();
for(int i=1;i<=m;i++)printf("%d\n",res[i]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?