AC 自动机 洛谷P3808 P3796 P5357

洛谷P3808

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int ch[maxn][30], fa[maxn], End[maxn];
int cnt = 0 , n;
int get_num(char c){return c - 'a';}
void build(string s){int cur = 0, len = s.length();for(int i = 0; i < len; i++){int c = get_num(s[i]);if(!ch[cur][c]) ch[cur][c] = ++cnt;cur = ch[cur][c];}End[cur]++;
}
void get_fail(){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){fa[v] =ch[fa[u]][i];q.push(v);}else v = ch[fa[u]][i];}		}
}
int query(string s){int cur = 0, ans = 0, len = s.length();for(int i = 0; i < len; i++){int c = get_num(s[i]);cur = ch[cur][c];for(int j = cur; j && End[j] != -1; j = fa[j]){ans += End[j];	End[j] = -1;}	}return ans;
}
int main() { string s;cin >> n;for(int i = 0; i < n; i++){cin >> s; build(s);}get_fail();		cin >> s;cout << query(s) << endl;	return 0;
}

洛谷P3796

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int ch[maxn][30], fa[maxn], End[maxn], ans[158], Maxs;
int cnt = 0 , n;
string str[158];
int get_num(char c){return c - 'a';}
void build(string s, int x){int cur = 0, len = s.length();for(int i = 0; i < len; i++){int c = get_num(s[i]);if(!ch[cur][c]) ch[cur][c] = ++cnt;cur = ch[cur][c];}End[cur] = x;
}
void get_fail(){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){fa[v] =ch[fa[u]][i];q.push(v);}else v = ch[fa[u]][i];}		}
}
void query(string s){int cur = 0, len = s.length();for(int i = 0; i < len; i++){int c = get_num(s[i]);cur = ch[cur][c];for(int j = cur; j; j = fa[j])if(End[j]){ans[End[j]]++; Maxs = max(Maxs, ans[End[j]]);}}	
}
int main() {string s; 	while(cin >> n && n){		for(int i = 0; i <= cnt; i++){			for(int j = 0; j < 26; j++)ch[i][j] = 0;fa[i] = 0; End[i] = 0;}memset(ans, 0, sizeof(ans));		Maxs = 0;cnt = 0;for(int i = 1; i <= n; i++){cin >> str[i]; build(str[i], i);}get_fail();		cin >> s;query(s);cout << Maxs << endl;	for(int i = 1; i <= n; i++)if(ans[i] == Maxs)cout << str[i] << endl;}	return 0;
}

luogu p5357

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 6, maxm = 2e5 + 6;
int ch[maxn][30], fa[maxn], End[maxn], ans[maxm], Map[maxn], In[maxn];
int cnt = 0 , n;
int pos[maxn];
int get_num(char c){return c - 'a';}
void build(string s, int x){int cur = 0, len = s.length();for(int i = 0; i < len; i++){int c = get_num(s[i]);if(!ch[cur][c]) ch[cur][c] = ++cnt;cur = ch[cur][c];}	
//	if(!End[cur])End[cur] = x;
//	Map[x] = End[cur];    pos[x] = cur;	//new
}
void get_fail(){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){fa[v] =ch[fa[u]][i];	In[ch[fa[u]][i]]++ ; //新加q.push(v);}else v = ch[fa[u]][i];}		}
}
void query(string s){int cur = 0, len = s.length();for(int i = 0; i < len; i++){int c = get_num(s[i]);cur = ch[cur][c];
//		for(int j = cur; j; j = fa[j])
//			if(End[j])ans[End[j]]++; ans[cur]++; 	//替换						}	
}
void topu(){queue<int> q;for(int i=1;i<=cnt;i++)if(In[i]==0)q.push(i);while(!q.empty()){int u=q.front();	q.pop();int v=fa[u];	In[v]--;ans[v] += ans[u];if(In[v]==0)q.push(v);}
}
int main() {string s; 	cin >> n;		for(int i = 1; i <= n; i++){cin >> s; build(s, i);}get_fail();		cin >> s;query(s);	topu();for(int i = 1; i <= n; i++)cout << ans[pos[i]] << endl;	return 0;
}

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

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

相关文章

C++蓝桥杯实训篇(二)

片头 嗨咯~小伙伴们&#xff01;今天我们来一起学习算法和贪心思维&#xff0c;准备好了吗&#xff1f;咱们开始咯&#xff01; 第1题 数位排序 对于这道题&#xff0c;我们需要自己写一个排序算法&#xff0c;也就是自定义排序&#xff0c;按照数位从小到大进行排序。 举一…

redisson常用加锁方式

RLock lock redissonClient.getLock("lock:order:" order);和redissonDistributedLocker.tryLock("lock:order:" order&#xff0c; TimeUnit.SECONDS, RedisLockKey.DEFAULT_WAIT_TIME, RedisLockKey.DEFAULT_HOLD_TIME);这两种加锁方式的区别如下&…

Go 微服务框架 | 路由实现

文章目录 不用框架实现web接口实现简单的路由实现分组路由支持不同的请求方式支持同一个路径的不同请求方式前缀树应用前缀树完善路由代码 不用框架实现web接口 // blog main.go 文件 package mainimport ("fmt""log""net/http" )func main() {…

zabbix中通过模板实现自动发现对tcp端口批量监控

主要为了解决监控大量端口&#xff0c;避免繁琐的重复操作监控项和触发器 诸位~ 仅供参考哈 自动发现监控参考地址: https://blog.csdn.net/qq_37510195/article/details/130893655 模板 首先创建一个模板 自定义名称和群组 创建自动发现规则 模板——自动发现——创建发现规则…

Mysql备忘记录

1、简介 Mysql操作经常忘记命令&#xff0c;本文将持续记录Mysql一些常用操作。 2、常见问题 2.1、忘记密码 # 1、首先停止Mysql服务 systemctl stop mysqld # windows 从任务管理器里面停 # 2、更改配置文件 my.cnf (windows是 ini文件) vim /etc/my.cnf 在[mysqld]下面添…

【蓝桥杯】15届JAVA研究生组F回文字符串

一、思路 1.这题去年考的时候想的是使用全排列进行尝试&#xff0c;实际不用这么麻烦&#xff0c;只用找到第一个和最后一个非特殊字符串的位置&#xff0c;然后分别向内检查是否对称&#xff0c;向外检查是否对称直到左指针小于0(可以通过添加使其对称) 2.至于如何找到第一个…

X 进制减法

题目链接&#xff1a; 思路&#xff1a; X进制数321怎么转换为十进制数为65&#xff1f;如下图&#xff1a; ①题目要求我们求 A - B 的最小值&#xff0c;对第 i 位&#xff0c;要求 A[i] - B[i] 的最小值&#xff0c;当进制越小的时候差值越小&#xff0c;但进制要比 max&…

java线程安全-单例模式-线程通信

首先看看单例模式的写法 首先我们先来回顾一下饿汉式单例模式&#xff1a; class Singleton{private static Singleton singletonnew Singleton();private Singleton(){}public static Singleton getInstrance(){return singleton;} } public class Test{public static void …

大数据技术之SPARK

Spark Core 什么是 RDD 代码中是一个抽象类&#xff0c;它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合 弹性 存储的弹性&#xff1a;内存与磁盘的自动切换&#xff1b; 容错的弹性&#xff1a;数据丢失可以自动恢复&#xff1b; 计算的弹性&#xff1a;…

Go 语言范围 (Range)

Go 语言范围 (Range) Go 语言是一种静态强类型、编译型、并发型编程语言&#xff0c;由 Google 开发。它的简洁性和高效性使其成为众多开发者的首选。在 Go 语言中&#xff0c;range 是一个非常有用的关键字&#xff0c;用于遍历数组、切片、字符串以及通道&#xff08;channe…

VUE中数据绑定之OptionAPI

<template> <div> 姓名:<input v-model="userName" /> {{ userName }} <br /> 薪水:<input type="number" v-model="salary" /> <br /> <button v-on:click="submit">提交</button>…

react动态路由

框架的权限控制&#xff08;在config.ts中配置&#xff09; export default {access: {}, }; 权限配置文件&#xff08;access.ts&#xff09; 新建 src/access.ts &#xff0c;在该文件中 export default 一个函数&#xff0c;定义用户拥有的权限 该文件需要返回一个 functi…

Android里面如何优化xml布局

在 Android 开发中&#xff0c;以下是系统化的优化方案&#xff0c;从基础到高级分层解析&#xff1a; 一、基础优化策略 1. 减少布局层级 问题&#xff1a;每增加一层布局&#xff0c;测量/布局时间增加 1-2ms 解决方案&#xff1a; <!-- 避免嵌套 --> <LinearLayo…

基于STM32、HAL库的IP6525S快充协议芯片简介及驱动程序设计

一、简介: IP6525S是一款高性能的同步降压DC-DC转换器芯片,具有以下特点: 输入电压范围:4.5V至32V 输出电压范围:0.8V至30V 最大输出电流:5A 效率高达95% 可编程开关频率(100kHz-1MHz) 支持PWM和PFM模式 内置过流保护、过温保护等功能 该芯片常用于工业控制、通信设备…

二分算法的入门笔记

二分查找 使用前提&#xff1a;有序。可理解为枚举的一种技巧。时间复杂度&#xff1a; l o g ( n ) log(n) log(n) 基础模版代码 使用时根据情景进行相应的变化。注意跳出条件and分支处理方式and返回答案&#xff0c;三者之间的配合&#xff0c;不要进入死循环。可以在模拟…

轻量级Java跨包调用(完全解耦)

Java函数式命令模式 轻量级跨包调用解耦方案&#xff0c;让跨包调用就像调用本地接口那样简单。适用与具有公共依赖的两个jar包&#xff0c;但是又不想相互引入对方作为依赖。 函数式命令模式&#xff0c;很好地实现了跨包调用解耦的目标&#xff0c;并且通过泛型JSON动态转换保…

离散数学问题集--问题5.9

问题 5.9 综合了计算机组成原理、数字逻辑和离散数学中的关键概念&#xff0c;旨在帮助学生理解二进制算术运算的硬件实现、逻辑门与算术运算的关系&#xff0c;以及如何使用数学方法来验证数字系统的正确性。它强调了从规范到实现再到验证的完整过程。 思想 函数抽象&#xf…

OpenLayers:海量图形渲染之矢量切片

最近由于在工作中涉及到了海量图形渲染的问题&#xff0c;因此我开始研究相关的解决方案。在咨询了许多朋友之后发现矢量切片似乎是行业内最常用的一种解决方案&#xff0c;于是我便开始研究它该如何使用。 一、什么是矢量切片 矢量切片按照我的理解就是用栅格切片的方式把矢…

神经网络入门—自定义网络

网络模型 定义一个两层网络 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F# 定义神经网络模型 class Net(nn.Module):def __init__(self, init_x0.0):super().__init__()self.fc1 nn.Linear(1, 10)self.fc2 nn.Linear(…

无人机装调与测试

文章目录 前言一、无人机基本常识/预备知识&#xff08;一&#xff09;无人机飞行原理无人机硬件组成/各组件作用1.飞控2.GPS3.接收机4.电流计5.电调6.电机7.电池8.螺旋桨9.UBEC&#xff08;稳压模块&#xff09; &#xff08;二&#xff09;飞控硬件简介&#xff08;三&#x…