首页 > 其他分享 >AC自动机

AC自动机

时间:2024-07-22 21:20:51浏览次数:12  
标签:AC int tr que fail MAXN 自动机

即在trie上kmp。AC自动机是一种多模式串匹配算法,用于在一个文本串中查找多个模式串。

注意到,AC自动机的\(fail\)也构成了一个树形结构。我们只需要在操作完进行一个离线拓扑排序就不用每次匹配到一个点,暴力跑完所有fail确认是哪些模式串。

struct AC {
    vector<int>end[MAXN];
    int tr[MAXN][26];
    int fail[MAXN], tot, in[MAXN];
    int cnt[MAXN], tag[MAXN];
    void insert(char* s, int n, int id) {
        int p = 0;
        for (int i = 1; i <= n; ++i) {
            if (tr[p][s[i] - 'a'] == 0)tr[p][s[i] - 'a'] = ++tot;
            p = tr[p][s[i] - 'a'];
        }
        end[p].push_back(id);
    }

    void getfail() {
        queue<int> que;
        for (int i = 0; i < 26; ++i)
            if (tr[0][i])
                que.push(tr[0][i]);
        while (!que.empty()) {
            int t = que.front();
            que.pop();
            for (int i = 0; i < 26; ++i)
                if (tr[t][i]) {
                    fail[tr[t][i]] = tr[fail[t]][i];
                    in[fail[tr[t][i]]]++;
                    que.push(tr[t][i]);
                } else {
                    tr[t][i] = tr[fail[t]][i];
                }
        }
    }

    void work(char* s, int n) {
        int p = 0;
        for (int i = 1; i <= n; ++i) {
            p = tr[p][s[i] - 'a'];
            tag[p]++;
        }
    }

    void topsort() {
        queue<int>q;
        for (int i = 1; i <= tot; ++i)
            if (!in[i])q.push(i);
        while (!q.empty()) {
            int t = q.front(); q.pop();
            for (auto x : end[t])
                cnt[x] = tag[t];
            in[fail[t]]--;
            tag[fail[t]] += tag[t];
            if (!in[fail[t]])q.push(fail[t]);
        }
    }

    void clear(int n) {
        for (int i = 0; i <= tot; ++i) {
            end[i].clear(), fail[i] = in[i] = tag[i] = 0;
            memset(tr[i], 0, sizeof(tr[i]));
        }
        for (int i = 1; i <= n; ++i)cnt[i] = 0;
        tot = 0;
    }

}ac;

例题:
luogu: P5357 【模板】AC 自动机
luogu: P2292 [HNOI2004] L 语言
HDU:7455 在 A 里面找有 C 的 B

标签:AC,int,tr,que,fail,MAXN,自动机
From: https://www.cnblogs.com/Qing17/p/18316931

相关文章

  • Camtasia2024苹果mac+win电脑破解版安装包下载!附带激活码许可证号
    在视频创作和教学内容制作领域,CamtasiaStudio一直是备受青睐的工具。随着2024版本的推出,CamtasiaStudio带来了更多强大的功能和优化,为用户提供了更高效、更便捷的创作体验。接下来,让我们详细了解一下CamtasiaStudio2024的新功能,并深入学习它的使用教程。camtasia202......
  • 【ACM出版】2024年云计算与大数据国际学术会议(ICCBD 2024,7月26-28)
    2024年云计算与大数据国际学术会议(ICCBD2024)将于2024年7月26-28日在中国大理召开。ICCBD2024将围绕“云计算与大数据”的最新研究领域,旨在为从事研究的专家、学者、工程师和技术人员提供一个国际平台,分享科研成果和尖端技术,了解学术发展趋势,拓宽研究思路,加强学术研......
  • 题解:CF1349B Orac and Medians
    洛谷|CF刷一些CF2000,进行一个录的记。思路记录首先观察到数列里的数不能凭空产生,所以初始序列必须含\(k\)。由于两个数的中位数是较小的那个,所以只要有一个与数列里的\(k\)相邻且比\(k\)大的数,就可以扩展到整个序列。发现可以把第二条推广一下,不必要和\(k\)相邻,因......
  • P3089 [USACO13NOV] Pogo-Cow S
    原题链接题解暴力dp:遍历\(i,j,k\),\(dp[i][j]=\max(dp[j][k])+v_i\)其中\(x_i-x_j\geqx_j-x_k\)优化:对于\(j\)来说,随着\(i\)越大,\(k\)可以越小,因此省去了遍历一层\(k\),而是维护每个点的\(k\),(反正求的是最大值)细节1.有两个方向2.任意起点code#include<bit......
  • Linux-shell脚本链接Oracle执行查询
    #!/bin/bash#zkm2024-07-22Linux脚本链接Oracle数据库,用户判断sftp、ftp生成文件目录是否为空,若为空则短信表插入一条数据,用于短信提醒。#注意:#1、当前服务器需要安装Oracle客户端#2、sqlplus验证连接Oracle正常#当前时间date_time=`date+"%Y%m%d%H%M"`#输出时间echo"开......
  • RBAC权限模型概述
    RBAC即role-basedaccesscontrol,基于角色的访问控制通过角色来管理用户对系统资源的访问权限。RBAC是一种权限管理模型,核心思想是分离用户与具体权限,通过角色作为中介来实现用户与权限的关联RBAC的三个基本元素User:访问者Role:User和Permission的桥梁,他是权限的集合,用户通过被......
  • iHack.dll 文件详解及其缺失的解决方法
    如果您的系统提示缺少ihack.dll,这种情况下,解决方法通常不建议简单地去网上搜索并下载ihack.dll文件,因为这会带来严重的安全风险,可能导致病毒感染、数据泄露或其他安全问题。正确的做法是:1.检查软件合法性确认您正在尝试运行的软件或游戏是合法的,没有被非法修改或包含恶意代......
  • org.springframework.beans.factory.BeanCreationException: Error creating bean wit
    场景:springcloud的服务service-order 启动和运行正常application.yml内容server:port:8007servlet:context-path:/service-orderspring:cloud:nacos:discovery:server-addr:192.168.56.30:8848application:name:service-......
  • Oracle 到 MySQL 函数替换方案汇总
    常用函数和语法转换  NVL函数Oracle语法:NVL(COUNT(*),0)MySQL语法:IFNULL(COUNT(*),0) 转字符串 Oracle语法:to_char(字段)MySQL语法:CONVERT(字段,CHAR) Rownum递增 Oracle语法:SELECTrownumnumFROMSYS_ENUMMySQL语法:SELECT(@i:=@i......
  • mybatis使用foreach批量插入
    创建表createtablepublic."match"(match_datedatenotnull,match_namecharactervarying(20)notnull,match_seasoncharactervarying(10)notnull,match_roundnumeric(2)notnull,home_teamcharactervarying(30)notnull,away_teamcharact......