AC自动机----模板题目

news2024/9/9 5:41:39

P3808 AC 自动机(简单版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef pair<int, int> pii;
typedef pair<ll, ll> PII;
#define pb emplace_back
//#define int ll
#define all(a) a.begin(),a.end()
#define x first
#define y second
#define ps push_back
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)

void solve();

const int N = 1e6 + 10;


signed main() {
    IOS;
    solve();
    return 0;
}

ll ch[N][26],idx;//ch 存储树边和转移边
ll ne[N];//ne 存储回跳边
ll cnt[N];//单词个数cnt

void c_insert(string s)//*****************错误*2
{
    ll p = 0;
    for(auto it : s)
    {
        ll j = it - 'a';
        //************这里写错了:ch[p][j] = ++ idx;
        if(!ch[p][j]) ch[p][j] = ++ idx;
        //************这里写错了:p = idx;
        p = ch[p][j];
    }
    cnt[p] ++;
}

void c_bulid()
{
    queue<ll> q;
    for(int i = 0; i < 26; ++ i)
        if(ch[0][i]) q.push(ch[0][i]);
    while(!q.empty())
    {
        ll u = q.front();//父节点
        q.pop();
        for(int i = 0; i < 26; ++ i)
        {
            ll v = ch[u][i];
            if(v)//有儿子
                ne[v] = ch[ne[u]][i],q.push(v);
            else//自建转移边
                ch[u][i] = ch[ne[u]][i];
        }
    }
}

ll c_query(string s)
{
    ll ans = 0;ll p = 0;
//    for(auto it : s)
//    {
//        ll p = ch[p][it - 'a'];
//        for(int j = p; j && ~cnt[j]; j = ne[j])
//        {
//            ans += cnt[j];cnt[j] = -1;
//        }
//
//    }
    for(int k=0,i=0; k < s.size(); ++ k)
    {
        i = ch[i][s[k] - 'a'];
        for(int j = i; j && ~cnt[j]; j = ne[j])
        {
            ans += cnt[j];cnt[j] = -1;
        }
    }
    return ans;
}

void solve() {
    ll n;
    cin >> n;
    string s;
    for(int i = 1; i <= n; ++ i)
    {cin >> s; c_insert(s);}
    cin >> s;
    c_bulid();
    cout << c_query(s);
}
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef pair<int, int> pii;
typedef pair<ll, ll> PII;
#define pb emplace_back
//#define int ll
#define all(a) a.begin(),a.end()
#define x first
#define y second
#define ps push_back
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)

void solve();

const int N = 1e6 + 10;


signed main() {
    IOS;
    solve();
    return 0;
}

ll ch[N][26],idx;//ch 存储树边和转移边
ll ne[N];//ne 存储回跳边
ll cnt[N];//单词个数cnt

void c_insert(string s)//*****************错误*2
{
    ll p = 0;
    for(auto it : s)
    {
        ll j = it - 'a';
        //************这里写错了:ch[p][j] = ++ idx;
        if(!ch[p][j]) ch[p][j] = ++ idx;
        //************这里写错了:p = idx;
        p = ch[p][j];
    }
    cnt[p] ++;
}

void c_bulid()
{
    queue<ll> q;
    for(int i = 0; i < 26; ++ i)
        if(ch[0][i]) q.push(ch[0][i]);
    while(!q.empty())
    {
        ll u = q.front();//父节点
        q.pop();
        for(int i = 0; i < 26; ++ i)
        {
            ll v = ch[u][i];
            if(v)//有儿子
                ne[v] = ch[ne[u]][i],q.push(v);
            else//自建转移边
                ch[u][i] = ch[ne[u]][i];
        }
    }
}

ll c_query(string s)
{
    ll ans = 0;ll p = 0;
    for(auto it : s)
    {
        p = ch[p][it - 'a'];//tmd,我服了,写成这个了:ll p = ch[p][it - 'a'];
        for(int j = p; j && ~cnt[j]; j = ne[j])//匹配
        {
            ans += cnt[j];cnt[j] = -1;//更新ans ,设为-1防止再次计数
        }

    }
//    for(int k=0,i=0; k < s.size(); ++ k)
//    {
//        i = ch[i][s[k] - 'a'];
//        for(int j = i; j && ~cnt[j]; j = ne[j])
//        {
//            ans += cnt[j];cnt[j] = -1;
//        }
//    }
    return ans;
}

void solve() {
    ll n;
    cin >> n;
    string s;
    for(int i = 1; i <= n; ++ i)
    {cin >> s; c_insert(s);}
    cin >> s;
    c_bulid();
    cout << c_query(s);
}

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

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

相关文章

YOLOv10环境搭建、训练自己的目标检测数据集、实际验证和测试

1 环境搭建 1.1 在官方仓库的给定的使用python3.9版本&#xff0c;则使用conda创建对应虚拟环境。 conda create -n yolov10 python3.9 1.2 切换到对应虚拟环境 conda activate yolov10 1.3 在指定目录下克隆yolov10官方仓库代码 git clone https://github.com/THU-MIG/yo…

手摸手教你撕碎西门子S7通讯协议10--S7Write写入float数据

1、S7通讯回顾 - &#xff08;1&#xff09;建立TCP连接 Socket.Connect-》已实现 - &#xff08;2&#xff09;发送访问请求 COTP-》已实现 - &#xff08;3&#xff09;交换通信信息 Setup Communication-》已实现 - &#xff08;4&#xff09;执行相关操作 …

器件学习——磁珠(2024.07.30)

参考链接1: 【器件篇】-25-磁珠的选型 在此感谢各位前辈大佬的总结&#xff0c;写这个只是为了记录学习大佬资料的过程&#xff0c;内容基本都是搬运的大佬博客&#xff0c;觉着有用自己搞过来自己记一下&#xff0c;如果有大佬觉着我搬过来不好&#xff0c;联系我删。 器件学习…

【MyBatis】史上最全的MyBatis执行SQL原理分析

目录 一、前言 二、简介 三、SQL 执行过程分析 3.1 SQL 执行入口分析 3.1.0 获取SqlSession对象 3.1.1 为 Mapper 接口创建代理对象 3.1.2 执行代理逻辑 3.1.2.1 获取 / 创建 MapperMethod 对象 3.1.2.1.1 创建 SqlCommand 对象 3.1.2.1.2 创建 MethodSignature 对象…

华为OD机试 - Wonderland游乐园 - 动态规划(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、3个测…

答应我,在量化策略回测里,避开未来函数这4个坑

由于社群的原因&#xff0c;看过不少策略&#xff0c;今天就腆着脸唠唠&#xff0c;量化新手期经常碰到未来函数的4个坑&#xff0c;希望量化萌新们少掉点儿头发。新手向文章&#xff0c;大神请绕行~ 情景1:使用前复权价格数据。 由于股票会存在分红送股的情形&#xff0c;价格…

芋道源码yudao-cloud 二开笔记(Editor富文本本地图片上传报错问题)

&#xff1a; 于是找到富文本的组件代码Editor.vue&#xff0c;检查一下上传的接口地址和token有没有传&#xff0c;如下图&#xff1a; 都没有问题&#xff0c;但还是报错&#xff0c;所以试试自定义上传的方法&#xff1a; // 导入上传文件的接口 import * as FileApi from …

reese84分析

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…

最近火爆的GraphRAG是什么?真的那么有用吗?

最近&#xff0c;微软提出的GraphRAG项目引起了广泛关注。那么&#xff0c;GraphRAG究竟是什么&#xff1f;它真的那么实用吗&#xff1f;本文将为您详细解读GraphRAG的概念及其应用。 什么是传统的RAG&#xff1f; &#x1f4da; 在深入了解GraphRAG之前&#xff0c;我们首先…

掌握AJAX技术:从基础到实战

文章目录 **引言****1. 什么是AJAX&#xff1f;****2. AJAX的工作原理**AJAX 示例使用 Fetch API 实现 AJAX **3. 如何在项目中使用AJAX****4. 处理AJAX请求的常见问题****5. AJAX与JSON的结合****6. 使用AJAX框架和库****7. 实战&#xff1a;创建一个动态表单****8. AJAX中的事…

Python 解决 ImportError: cannot import name ‘example’

Python 解决 ImportError: cannot import name ‘example’ 在Python编程的广阔天地中&#xff0c;ImportError: cannot import name example 是一个令人头疼但又常见的错误。当你试图从某个模块中导入一个不存在的名称时&#xff0c;这个错误就会悄然降临。本文将带你深入探索…

AI推理硬件成本分析:AMD Instinct MI300X与Nvidia GPU比较

随着AI模型训练成本的上升&#xff0c;人们越来越关注推理硬件的成本&#xff0c;尤其是在需要低延迟响应的应用中。Transformer模型需要强大的硬件支持&#xff0c;例如200毫秒以下的响应时间。Artificial Analysis最近分析了AI模型性能和定价&#xff0c;特别指出AMD的“Anta…

「豆包Marscode体验官」AI加持的云端IDE——三种方法高效开发前后端聊天交互功能

豆包 MarsCode 是一个集成了AI功能的编程助手和云端IDE&#xff0c;旨在提高开发效率和质量。它支持多种编程语言和IDE&#xff0c;提供智能代码补全、代码解释、单元测试生成和问题修复等功能&#xff0c;同时具备AI对话视图和开发工具。 豆包 MarsCode 豆包 MarsCode 编程助…

跟着动脑学院学习Android 开发基础

跟着动脑学院up主学习Android开发&#xff0c;记录学习笔记 2022 最新 Android 基础教程&#xff0c;从开发入门到项目实战&#xff0c;看它就够了&#xff0c;更新中_哔哩哔哩_bilibili &#xff08;弱弱地说一句&#xff0c;绝大部分内容都是up主为我们准备好的资料里摘抄下…

机器学习 | 评估原理——模型评估与交叉验证

Hi&#xff0c;大家好&#xff0c;我是半亩花海。学完分类算法原理的知识&#xff0c;我们进入评估相关知识的学习&#xff0c;继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享模型评估与交叉验证相关评估原理。本章的基于前几节已建立的模型进行评估知识…

【C语言】Linux 飞翔的小鸟

【C语言】Linux 飞翔的小鸟 零、环境部署 安装Ncurses库 sudo apt-get install libncurses5-dev壹、编写代码 代码如下&#xff1a; bird.c #include<stdio.h> #include<time.h> #include<stdlib.h> #include<signal.h> #include<curses.h>…

LeetCode:相同的树(C语言)

1、问题概述&#xff1a;给2个二叉树的根节点p和q&#xff0c;如果2个树在结构和数值上都相同才为true&#xff0c;否则为false 2、示例 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;p [1,2], q […

做知识付费项目还能做吗?知识付费副业项目如何做?能挣多少钱?

hello,我是阿磊&#xff0c;一个20年的码农&#xff0c;6年前代码写不动了&#xff0c;转型专职做副业项目研究&#xff0c;为劳苦大众深度挖掘互联网副业项目&#xff0c;共同富裕。 现在做知识付费项目还能做吗&#xff1f; 互联网虚拟资源项目我一直在做&#xff0c;做了有…

AI绘画模型之:UNet、Imagen 与 DeepFloyd IF

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

spring boot(学习笔记第十五课)

spring boot(学习笔记第十五课) Spring boot的websocket(广播) 学习内容&#xff1a; Spring boot的websocket&#xff08;广播&#xff09; 1. Spring boot的websocket&#xff08;广播&#xff09; 回顾下web server的进化 第一代Web程序&#xff0c;使用整体页面刷新技术…