首页 > 其他分享 >洛谷P3808 【模板】AC 自动机(简单版)题解 AC自动机模板题

洛谷P3808 【模板】AC 自动机(简单版)题解 AC自动机模板题

时间:2023-09-03 23:55:38浏览次数:47  
标签:AC int tr son ++ fail 自动机 id 模板

题目链接:https://www.luogu.com.cn/problem/P3808

AC自动机模板题。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;

struct Node {
    int son[26], fail, id;
    Node() {}
    Node(int _id) {
        memset(son, 0, sizeof(son));
        fail = 0;
        id = _id;
    }
} tr[maxn];
int n, cnt, cc[maxn];
char s[maxn];

void ins(char *s, int id) {
    int u = 0;
    for (; *s; s++) {
        int c = (*s) - 'a';
        if (!tr[u].son[c])
            tr[ tr[u].son[c] = ++cnt ] = Node(0);
        u = tr[u].son[c];
    }
    tr[u].id = id;
    cc[u]++;
}

void build() {
    queue<int> que;
    for (int i = 0; i < 26; i++)
        if (tr[0].son[i])
            que.push(tr[0].son[i]);
    while (!que.empty()) {
        int u = que.front();
        que.pop();
        for (int i = 0; i < 26; i++) {
            int v = tr[u].son[i];
            if (!v) continue;
            int x = tr[u].fail;
            while (x && !tr[x].son[i])
                x = tr[x].fail;
            tr[v].fail = tr[x].son[i];
            que.push(v);
        }
    }
}

bool vis[maxn];
int cal(char *s) {
    int u = 0, cnt = 0;
    for (; *s; s++) {
        int c = (*s) - 'a';
        while (u && !tr[u].son[c])
            u = tr[u].fail;
        if (tr[u].son[c])
            u = tr[u].son[c];
        if (tr[u].id && !vis[tr[u].id]) {
            vis[tr[u].id] = true;
            cnt += cc[u];
        }
    }
    return cnt;
}

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%s", s);
        ins(s, i);
    }
    build();
    scanf("%s", s);
    printf("%d\n", cal(s));
    return 0;
}

标签:AC,int,tr,son,++,fail,自动机,id,模板
From: https://www.cnblogs.com/quanjun/p/17675863.html

相关文章

  • Nacos 注册中心的设计原理:让你的应用轻松实现高效注册与发现!
    当应用开始脱离单机运行和访问时,服务发现就诞生了。目前的网络架构是每个主机都有⼀个独立的IP地址,服务发现基本都是通过某种方式获取到服务所部署的IP地址。DNS协议是最早将⼀个网络名称翻译为网络IP的协议,在最初的架构选型中,DNS+LVS+Nginx基本满足所有RESTful服务的发......
  • AQS(AbstractQueuedSynchronizer)
    【Mic】AQS的实现原理面试必问的AQS(AbstractQueuedSynchronizer),一文全搞定(qq.com)AQS原理(口语回答)AQS(AbstractQueuedSynchronizer)是JUC下非常核心的一个抽象类,为多线程访问同步资源提供了一个队列同步器。在JUC包下,很多组件都依赖AQS实现线程的同步和唤醒,比如Lock、Semaphor......
  • Ant Design 5.8.6 发布,企业级 UI 设计语言和 React 实现
    AntDesign5.8.6发布,企业级UI设计语言和React实现来源:OSCHINA编辑: 白开水不加糖2023-09-0310:31:02 0AntDesign 5.8.6 现已发布,主要变化如下: 针对CSSInJS加载styles大小进行了优化。Notification和Message组件只有在展示时才会插入对......
  • 2023.9.3 AT practise
    ARC075F考虑移项,设\(x=\overline{abcde}\),那么\(rev(x)=\overline{edcba}\).那么\(x-rev(x)=(a-e)\cdot(10^4-10^0)+(b-d)\cdot(10^3-10^1)+c\cdot(10^2)=D\)考虑dfs,状态为当前取到第几位,\(D\)减去前面的值是多少,以及方案数。枚举每一位的取值,可以有\(-9\sim9\)的......
  • CDC一键入湖:当 Apache Hudi DeltaStreamer 遇见 Serverless Spark
    ApacheHudi的DeltaStreamer是一种以近实时方式摄取数据并写入Hudi表的工具类,它简化了流式数据入湖并存储为Hudi表的操作,自0.10.0版开始,Hudi又在DeltaStreamer的基础上增加了基于Debezium的CDC数据处理能力,这使得其可以直接将Debezium采集的CDC数据落地成Hudi表,这一功能极大地简......
  • 微服务 - Nacos
    目录Nacos认识和安装服务注册Nacos认识和安装Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高官网:nacos.io#启动startup.cmd-mstandalone启动成功后访问:http://192.168.222.1:8848/nacos/index.html默认的账号......
  • 【题解】P2900 [USACO08MAR] Land Acquisition G
    题目链接:P2900[USACO08MAR]LandAcquisitionG我们通过题目可以得出一个较为清晰的结论:我们将所有的矩形排列起来,可以发现最后被完全包含在另一个矩形内的矩形是没有意义的。这样的话我们得到的所有矩形的并是呈阶梯状的,如下图:其中,中间的浅蓝色的边是没有意义的然后我......
  • MyBatisPlus操作Oracle(插入数据主键自增)
    示例代码:代码不需要修改,需要操作的是相对应的数据库,在Oracle中是不支持ID自增的,这时候我们就需要手动设置一些规则,来让ORM框架支持自增(实际是数据库层面做的)MyBatisPlus操作Oracle关于oracle11g和12c发行时间以及区别:Oracle11g是Oracle公司在2007年发行的一款数据库软管......
  • Acwing.第119场周赛
    可惜这场比赛没打,去操场溜达去了哈哈哈哈比赛链接A字符串还原有一个由小写字母构成的字符串b是通过以下方法生成的:首先,构造一个由小写字母构成的长度不少于2的字符串a。然后,按照从左到右的顺序,将字符串a的所有长度为2的子串拼接在一起,构成字符串b。例如,如果字符串a......
  • 注册中心Nacos
    一、SpringCloud简介1、SpringCloud是什么SpringCloud是一系列框架的有序集合,这些框架为我们提供了分布式系统构建工具。2、SpringCloud包含那些项目项目项目名称服务注册于发现AlibabaNacos、NetflixEureka、ApacheZookper分布式配置中心AlibabaNacos、......