当前位置: 首页 > news >正文

AC自动机(简单版 II)

AC自动机(简单版 II)

P3796 AC 自动机(简单版 II)

题目描述

\(N\) 个由小写字母组成的模式串以及一个文本串 \(T\)。每个模式串可能会在文本串中出现多次。你需要找出哪些模式串在文本串 \(T\) 中出现的次数最多。

输入格式

输入含多组数据。保证输入数据不超过 \(50\) 组。

每组数据的第一行为一个正整数 \(N\),表示共有 \(N\) 个模式串,\(1 \leq N \leq 150\)

接下去 \(N\) 行,每行一个长度小于等于 \(70\) 的模式串。下一行是一个长度小于等于 \(10^6\) 的文本串 \(T\)。保证不存在两个相同的模式串。

输入结束标志为 \(N=0\)

输出格式

对于每组数据,第一行输出模式串最多出现的次数,接下去若干行每行输出一个出现次数最多的模式串,按输入顺序排列。

输入输出样例 #1

输入 #1

2
aba
bab
ababababac
6
beta
alpha
haha
delta
dede
tata
dedeltalphahahahototatalpha
0

输出 #1

4
aba
2
alpha
haha
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
struct Tree//字典树 
{int fail;//失配指针int vis[26];//子节点的位置int end;//标记以这个节点结尾的单词编号 
}AC[100000];//Trie树
int cnt=0;//Trie的指针 
struct Result
{int num;int pos;
}Ans[100000];//所有单词的出现次数 
bool operator <(Result a,Result b)
{if(a.num!=b.num)return a.num>b.num;elsereturn a.pos<b.pos;
}
string s[100000];
inline void Clean(int x)
{memset(AC[x].vis,0,sizeof(AC[x].vis));AC[x].fail=0;AC[x].end=0;
}
inline void Build(string s,int Num)
{int l=s.length();int now=0;//字典树的当前指针 for(int i=0;i<l;++i)//构造Trie树{if(AC[now].vis[s[i]-'a']==0)//Trie树没有这个子节点{AC[now].vis[s[i]-'a']=++cnt;//构造出来Clean(cnt);}now=AC[now].vis[s[i]-'a'];//向下构造 }AC[now].end=Num;//标记单词结尾 
}
void Get_fail()//构造fail指针
{queue<int> Q;//队列 for(int i=0;i<26;++i)//第二层的fail指针提前处理一下{if(AC[0].vis[i]!=0){AC[AC[0].vis[i]].fail=0;//指向根节点Q.push(AC[0].vis[i]);//压入队列 }}while(!Q.empty())//BFS求fail指针 {int u=Q.front();Q.pop();for(int i=0;i<26;++i)//枚举所有子节点{if(AC[u].vis[i]!=0)//存在这个子节点{AC[AC[u].vis[i]].fail=AC[AC[u].fail].vis[i];//子节点的fail指针指向当前节点的//fail指针所指向的节点的相同子节点 Q.push(AC[u].vis[i]);//压入队列 }else//不存在这个子节点 AC[u].vis[i]=AC[AC[u].fail].vis[i];//当前节点的这个子节点指向当//前节点fail指针的这个子节点 }}
}
int AC_Query(string s)//AC自动机匹配
{int l=s.length();int now=0,ans=0;for(int i=0;i<l;++i){now=AC[now].vis[s[i]-'a'];//向下一层for(int t=now;t;t=AC[t].fail)//循环求解Ans[AC[t].end].num++;}return ans;
}
int main()
{int n;while(233){cin>>n;if(n==0)break;cnt=0;Clean(0);for(int i=1;i<=n;++i){cin>>s[i];Ans[i].num=0;Ans[i].pos=i;Build(s[i],i);}AC[0].fail=0;//结束标志 Get_fail();//求出失配指针cin>>s[0];//文本串 AC_Query(s[0]);sort(&Ans[1],&Ans[n+1]);cout<<Ans[1].num<<endl;cout<<s[Ans[1].pos]<<endl;for(int i=2;i<=n;++i){if(Ans[i].num==Ans[i-1].num)cout<<s[Ans[i].pos]<<endl;elsebreak;}}return 0;
}
http://www.jsqmd.com/news/420399/

相关文章:

  • 苏州走出的“小巨人”:西恩士工业如何用清洁度萃取设备定义国产新高度? - 工业干货社
  • Google 悄悄更新了 Gemini 3.1,这次的重点,有点不一样
  • 2026年2月在线客服外包公司权威推荐,多渠道接入与统一服务标准 - 品牌鉴赏师
  • 亲测好用!研究生专用降AIGC工具 —— 千笔·降AI率助手
  • 京东E卡兑换攻略!秒变现金小妙招 - 团团收购物卡回收
  • 【路径规划】基于C-Space到A*算法的多边形机器人避障路径规划附MATLAB代码
  • NMN品牌推荐哪款?聚焦最好的NMN产品排名第一名,NMN哪个牌子最靠谱?榜首抗衰胜出 - 资讯焦点
  • 显卡基础
  • 从“疑难杂症”到“标准答案”:苏州西恩士工业清洁度检测设备的破局之道 - 工业干货社
  • 分析高压加速老化试验箱,广东地区性价比高的供应商推荐 - 工业推荐榜
  • MPFS250TS LOG
  • 2026年重庆抖音短视频代运营公司排行榜TOP5发布 - 精选优质企业推荐榜
  • 京东e卡用不上?这样处理不浪费,亲测靠谱 - 抖抖收
  • 2026实验室排风、实验台、通风柜、实验室装修改造厂家五大推荐:迅领实验室领衔,打造全链条安全实验空间 - 深度智识库
  • paperxie本科毕业论文写作:一个普通大学生的30天论文“复活“实录
  • 2026年目前正规的包装袋制造商哪个好,聚酯尼龙袋/八边封包装袋/四边封包装袋/自立拉链袋,包装袋优质厂家口碑推荐榜 - 品牌推荐师
  • Paperxie本科毕业论文写作:18天从零到优秀的完整时间轴实录
  • 江西储油罐选购,口碑好的品牌推荐哪家? - 工业推荐榜
  • AI少儿英语APP的开发流程
  • pnpm依赖隔离深度解析
  • 2026年西藏抖音短视频代运营服务商5强推荐名单公布 - 精选优质企业推荐榜
  • 2026年内蒙古抖音短视频代运营服务商5强推荐榜单发布 - 精选优质企业推荐榜
  • C# Modbus RTU 数据采集系统代码功能说明(基于原始代码解读)
  • 联合体用于通讯协议解析与封装--元宝生成
  • 2026年2月出口美洲市场:哪些门窗厂商出口澳洲信誉最佳? - 2026年企业推荐榜
  • 系统巡检:规范设备升级、路由配置与配置管理全流程指南
  • 分形时间正则化:给 Navier–Stokes 方程装上“多尺度快门”
  • 宝马“具身AI产线”迭代:Hexagon AEON人形机器人正式落地莱比锡工厂
  • 运行指标量化:企业本地连通、专网性能与使用率达标评估指南
  • 本地HTTPS证书免费 使用本地私有IP而不是域名作为站点,IIS部署站点