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

P3808 AC 自动机(简单版)

这两题始终做完  P5357 【模板】AC 自动机  这题的基础上做的

P3808 AC 自动机(简单版)

更改一下范围和打印内容。

#include<bits/stdc++.h>
#define ll long long 
#define endl "\n"
using namespace std;
const int MAX0 = 2e6 + 3;
const int MAXN = 2e6 + 3;
struct {int trie[MAX0][26], cnt = 0;//字典树(a~z)int output[MAX0];             // 输出标记,及以此位置结尾的的模式串有多少个;(很少用)int fail[MAX0];//失配指针int ins[MAXN], insi;//输入第i个模式串的结尾位置vector<int> ins;int time[MAX0];             // 在匹配串中,这个位置出现过多少次;// 初始化void init() {memset(trie, 0, sizeof(trie));memset(fail, 0, sizeof(fail));memset(ins, 0, sizeof(ins));memset(output, 0, sizeof(output));memset(time, 0, sizeof(time));cnt = 0, insi = 0;}void inittime() {memset(time, 0, sizeof(time));}//插入模式串,建立tire树(字典树)void insert(string s) {int sn = s.size();int i = 0;for (int z = 0; z < sn; z++) {int j = s[z] - 'a';if (!trie[i][j]) {trie[i][j] = ++cnt;}i = trie[i][j];}ins[insi++] = i;output[i]++;}// 构建失配指针+建立直通表(优化trie)(避免绕圈)void build() {queue<int> q;for (int j = 0; j < 26; j++) {if (trie[0][j] != 0) {fail[trie[0][j]] = 0;q.push(trie[0][j]);}}while (!q.empty()) {int u = q.front();q.pop();for (int j = 0; j < 26; j++) {if (trie[u][j] != 0) {fail[trie[u][j]] = trie[fail[u]][j];q.push(trie[u][j]);}else {trie[u][j] = trie[fail[u]][j];}}}}//建立fail的反树,避免遍历文章时绕圈void opposedfail() {vector<vector<int>> opposed(cnt+1, vector<int>());vector<bool> visited(cnt + 1, false);for (int i = 1; i <= cnt; i++) {opposed[fail[i]].push_back(i);}stack<int> q;q.push(0);while (!q.empty()) {int i = q.top();if (!visited[i]) {visited[i] = true;for (int j = 0; j < opposed[i].size(); j++) {q.push(opposed[i][j]);}}else {time[fail[i]] += time[i];q.pop();}}}//匹配串匹配void search(string s) {int sn = s.size();int i = 0;for (int z = 0; z < sn; z++) {int j = s[z] - 'a';time[trie[i][j]]++;i = trie[i][j];}opposedfail();}}AC;
void solve() {int n;AC.init();cin >> n;string s;for (int i = 0; i < n; i++) {cin >> s;AC.insert(s);}AC.build();cin >> s;AC.search(s);int ans = 0;for (int i = 0; i < AC.insi; i++) {if (AC.time[AC.ins[i]]) {ans++;}}cout << ans << endl;return;
}
int main(){ios::sync_with_stdio(false);        // 禁用同步std::cin.tie(nullptr),std::cout.tie(nullptr);             // 解除cin与cout绑定int t = 1;//cin >> t;while (t--) {solve();}return 0;
}

P3796 AC 自动机(简单版 II)

同上修改

#include<bits/stdc++.h>
#define ll long long 
#define endl "\n"
using namespace std;
const int MAX0 = 2e4 + 3;
const int MAXN = 150 + 3;
struct {int trie[MAX0][26], cnt = 0;//字典树(a~z)int output[MAX0];             // 输出标记,及以此位置结尾的的模式串有多少个;(很少用)int fail[MAX0];//失配指针int ins[MAXN], insi;//输入第i个模式串的结尾位置vector<int> ins;int time[MAX0];             // 在匹配串中,这个位置出现过多少次;// 初始化void init() {memset(trie, 0, sizeof(trie));memset(fail, 0, sizeof(fail));memset(ins, 0, sizeof(ins));memset(output, 0, sizeof(output));memset(time, 0, sizeof(time));cnt = 0, insi = 0;}void inittime() {memset(time, 0, sizeof(time));}//插入模式串,建立tire树(字典树)void insert(string s) {int sn = s.size();int i = 0;for (int z = 0; z < sn; z++) {int j = s[z] - 'a';if (!trie[i][j]) {trie[i][j] = ++cnt;}i = trie[i][j];}ins[insi++] = i;output[i]++;}// 构建失配指针+建立直通表(优化trie)(避免绕圈)void build() {queue<int> q;for (int j = 0; j < 26; j++) {if (trie[0][j] != 0) {fail[trie[0][j]] = 0;q.push(trie[0][j]);}}while (!q.empty()) {int u = q.front();q.pop();for (int j = 0; j < 26; j++) {if (trie[u][j] != 0) {fail[trie[u][j]] = trie[fail[u]][j];q.push(trie[u][j]);}else {trie[u][j] = trie[fail[u]][j];}}}}//建立fail的反树,避免遍历文章时绕圈void opposedfail() {vector<vector<int>> opposed(cnt+1, vector<int>());vector<bool> visited(cnt + 1, false);for (int i = 1; i <= cnt; i++) {opposed[fail[i]].push_back(i);}stack<int> q;q.push(0);while (!q.empty()) {int i = q.top();if (!visited[i]) {visited[i] = true;for (int j = 0; j < opposed[i].size(); j++) {q.push(opposed[i][j]);}}else {time[fail[i]] += time[i];q.pop();}}}//匹配串匹配void search(string s) {int sn = s.size();int i = 0;for (int z = 0; z < sn; z++) {int j = s[z] - 'a';time[trie[i][j]]++;i = trie[i][j];}opposedfail();}}AC;
int n;
void solve() {AC.init();vector<string >f(n);for (int i = 0; i < n; i++) {cin >> f[i];AC.insert(f[i]);}AC.build();string s;cin >> s;AC.search(s);int max_f = 0;for (int i = 0; i < AC.insi; i++) {max_f = max(AC.time[AC.ins[i]], max_f);}cout << max_f << endl;for (int i = 0; i < AC.insi; i++) {if (AC.time[AC.ins[i]] == max_f) {cout << f[i] << endl;}}return;
}
int main(){ios::sync_with_stdio(false);        // 禁用同步std::cin.tie(nullptr),std::cout.tie(nullptr);             // 解除cin与cout绑定int t = 1;//cin >> t;while (cin>>n) {if (n == 0) {break;}solve();}return 0;
}

http://www.dtcms.com/a/456685.html

相关文章:

  • C++----bitmap位图的使用
  • 单链表的应用02---算法中的暴力美学(第八讲)
  • 【RAG】优化query查询效果的几种处理
  • transformer详解(位置编码+attention+残差连接+全连接网络)
  • 已注册域名怎么做网站呢免费网站免费网站平台
  • 如何解决 pip install -r requirements.txt 约束文件 constraints.txt 仅允许固定版本(未锁定报错)问题
  • 【Camera】准备的一些Camera面试题——相机预览、拍照流程(经验尚欠,待补充)
  • CICD工具选型指南,GitLab cicd vs Arbess哪一款更好用?
  • 尉Lucene.Net 分词器选择指南:盘古分词 vs 结巴分词h
  • gitlab runner 安装
  • MySQL的OR条件查询不走索引及解决方案
  • 1688 店铺商品全量采集与智能分析:从接口调用到供应链数据挖掘
  • 淘宝商品详情采集方式,json数据返回
  • 【论文精度-1】 组合优化中的机器学习:方法论之旅(Yoshua Bengio, 2021)
  • 南京维露斯网站建设微信营销软件app
  • 从帧边界识别到数据编码:嵌入式通信协议与数据序列化方案深度对比
  • Quick SwiftObjective-C测试框架入门教程
  • GRM tools三大插件使用教程
  • C62-结构体的指针
  • 腾讯云 建网站企业网站seo公司
  • Java-143 深入浅出 MongoDB NoSQL:MongoDB、Redis、HBase、Neo4j应用场景与对比
  • 线程1——javaEE 附面题
  • 吴恩达机器学习课程(PyTorch适配)学习笔记:1.4 模型评估与问题解决
  • 后端_基于注解实现的请求限流
  • 从 0 到 1 搭建 Python 语言 Web UI自动化测试学习系列 10--基础知识 6--元素等待方式和内联框架
  • 织梦网站如何做seo重庆市城市建设档案馆官方网站
  • 一文详解Go语言字符串
  • 通用:MySQL-LBCC并发锁机制
  • Elasticsearch:使用推理端点及语义搜索演示
  • 基于websocket的多用户网页五子棋(九)