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

AC自动机

时间:2023-08-22 20:23:14浏览次数:30  
标签:AC int ne KMP 自动机 define

AC自动机

本质上是 KMP+Trie。

每个节点存储的 \(ne\) 类似于 KMP,表示最长公共前后缀(前缀可以是从根出发的任意一条路径)。代码可以从 KMP 一一对应过来。

Trie 图优化,本质上可以直接背代码。

#include<cstdio>
#include<cstring>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while

const int N=10010,S=55;
int T,n,tr[N*S][26],idx,cnt[N*S],q[N*S],ne[N*S];
char s[N*100];
void insert(char s[]){
    int p=0;
    for(int i=0;s[i];++i){
        int &now=tr[p][s[i]-'a'];
        if(!now)now=++idx;
        p=now;
    }
    ++cnt[p];
}
void AC(){
    int hh=0,tt=0;
    L(i, 26)if(tr[0][i])q[tt++]=tr[0][i];
    while(hh!=tt){
        int t=q[hh++];
        L(i, 26){
            int p=tr[t][i];
            if(!p)tr[t][i]=tr[ne[t]][i];
            else ne[p]=tr[ne[t]][i],q[tt++]=p;
        }
    }
}
int main(){
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    #endif
    scanf("%d",&T);
    W(T){
        int res=0;
        memset(ne,0,sizeof ne);
        memset(cnt,0,sizeof cnt);
        memset(tr,0,sizeof tr);
        idx=0;
        scanf("%d",&n);
        E(i, n){
            scanf("%s",s);
            insert(s);
        }
        AC();
        scanf("%s",s);
        for(int i=0,j=0;s[i];++i){
            int c=s[i]-'a';
            j=tr[j][c];
            int tmp=j;
            while(tmp&&~cnt[tmp]){
                res+=cnt[tmp];
                cnt[tmp]=-1;
                tmp=ne[tmp];
            }
        }
        printf("%d\n",res);
    }
    return 0;
}

标签:AC,int,ne,KMP,自动机,define
From: https://www.cnblogs.com/wscqwq/p/17649602.html

相关文章

  • 小米(XiaoMi) Red Mi ac2100 刷 breed 并刷入 自编译openwrt(未完待续
    刷入breed选择为合适的系统版本为了打开ssh,我们需要选择有漏洞的固件版本。小米ac2100的版本为2.0.722红米ac2100的版本为2.0.7如果不是该版本则需降级,如下图我刚收到的红米ac2100就需要降级。这里最好勾选清除当前所有用户配置。降级完后:ssh上去在路由器管理界面的......
  • (转载)msys2 pacman 安装 删除等常见命令汇总
    安装#安装软件。也可以同时安装多个包,只需以空格分隔包名即可。pacman-S软件名#安装软件,但不重新安装已经是最新的软件。pacman-S--needed软件名1软件名2#安装软件前,先从远程仓库下载软件包数据库(数据库即所有软件列表)。pacman-Sy软件名#在显示一些操作信息......
  • 什么是 Spartacus Storefront B2B store 的 My Company 菜单
    Spartacus是一个基于Angular的开源JavaScriptweb应用,与SAPCommerceCloud的RESTAPI进行交互。它的目标是提供一个稳定、可靠、可扩展的前端解决方案,让开发者能够创建全功能的商店,同时避免了与后端系统的紧密耦合。其中,B2Bstore是一个专门为B2B交易设计的商店,而My......
  • ACM MM 2023 | 腾讯优图实验室6篇论文入选,含视觉识别、半监督学习等研究方向
    前言 近日,腾讯优图实验室6篇论文被国际人工智能多媒体领域顶级会议ACMMM2023(ACMInternationalConferenceonMultimedia)所接收,涵盖视觉识别、神经绘画和风格化研究、半监督学习等多个研究方向,进一步展示了腾讯优图实验室在人工智能领域的技术能力和学术成果。ACMMM是计算机......
  • 【笔记】机器学习基础 - Ch5. Support Vector Machines
    5.1Linearclassification考虑如下问题:\(\mathbb{R}^N\)上的\(\calX\)服从某个未知分布\(\calD\),并由目标函数\(f:\calX\toY\)映射到\(\{-1,+1\}\)。根据采样\(S=(({\bfx}_1,y_1),\dotsb,({\bfx}_m,y_m))\)确定一个二分类器\(h\in\calH\),使得其泛化......
  • 使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(3)
    使用ApacheIoTDB进行IoT相关开发的架构设计与功能实现(3)接下来我给大家继续介绍一下ApacheIoTDB的数据类型和相关用法在显示时间戳时,IoTDB可以支持长类型和日期时间显示类型。日期时间显示类型可以支持用户定义的时间格式。自定义时间格式的语法如下表所示:**自定义时间格式的语......
  • 2.Acwing基础课第786题-简单-第k个数
    2.Acwing基础课第786题-简单-第k个数题目描述给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列从小到大排序后的第k个数。输入格式第一行包含整数n和k。第二行包含n个整数(所有整数均在1~范围内),表示整个数列。输出格式输出一个整数,表示数列的第k......
  • 5.Acwing基础课第792题-简单-高精度减法
    5.Acwing基础课第792题-简单-高精度减法题目描述给定两个正整数(不含前导0),计算它们的差,计算结果可能为负数。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的差。数据范围1≤整数长度≤100000输入样例3211输出样例21思路解析:算法:时间复杂度:*O(nlog(n)......
  • 4.Acwing基础课第791题-简单-高精度加法
    4.Acwing基础课第791题-简单-高精度加法题目描述给定两个正整数(不含前导0),计算它们的和。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的和。数据范围1≤整数长度≤100000输入样例1223输入样例35思路解析:算法:时间复杂度:*O(nlog(n))*解题思路:代码:......
  • 7.Acwing基础课第794题-简单-高精度除法
    7.Acwing基础课第794题-简单-高精度除法题目描述给定两个非负整数(不含前导0)A,B,请你计算A/B的商和余数。输入格式共两行,第一行包含整数A,第二行包含整数B。输出格式共两行,第一行输出所求的商,第二行输出所求余数。数据范围1≤A的长度≤100000,1≤B≤10000,B一定不为......