【模板】AC自动机(加强版)【AC自动机fail树上求最多出现次数】

2023-11-15

题目链接 P3796


  给出N个模式串,然后我们用一个文本串去进行匹配,这样的做法,就是AC自动机了,于是乎,我们可以先将N个模式串丢进去,然后建立fail树,然后先对所有的节点求出最大串在文本串中出现的次数,然后利用dfs跑fail树的办法,我们可以O(N)的求解这个问题。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define pii pair<int, int>
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 70 * 150 + 7;
int N, tot, root;
struct Trie_node
{
    int nex[26], val, fail;
    Trie_node() { memset(nex, 0, sizeof(nex)); val = 0; fail = 0; }
    void clear() { memset(nex, 0, sizeof(nex)); val = 0; fail = 0; }
} t[maxN];
char s[155][77], T[1000006];
void Insert(int ith)
{
    int len = (int)strlen(s[ith]), u = root;
    for(int i=0, id; i<len; i++)
    {
        id = s[ith][i] - 'a';
        if(!t[u].nex[id])
        {
            t[u].nex[id] = ++tot;
            t[tot].clear();
        }
        u = t[u].nex[id];
    }
    t[u].val = ith;
}
int que[maxN], top, tail;
void build_fail()
{
    top = tail = 0;
    que[tail++] = root;
    int tmp, p, son;
    while(top < tail)
    {
        tmp = que[top++];
        for(int i=0; i<26; i++)
        {
            son = t[tmp].nex[i];
            if(son)
            {
                if(!tmp) t[son].fail = 0;
                else
                {
                    p = t[tmp].fail;
                    while(p && !t[p].nex[i]) p = t[p].fail;
                    t[son].fail = t[p].nex[i];
                }
                if(t[t[son].fail].val) t[son].val += t[t[son].fail].val;
                que[tail++] = son;
            }
            else t[tmp].nex[i] = t[t[tmp].fail].nex[i];
        }
    }
}
vector<int> to[maxN];
int siz[maxN] = {0}, maxx;
vector<int> ans;
void dfs(int u)
{
    for(int v : to[u])
    {
        dfs(v);
        siz[u] += siz[v];
    }
    if(t[u].val)
    {
        if(siz[u] > maxx)
        {
            maxx = siz[u];
            ans.clear();
            ans.push_back(t[u].val);
        }
        else if(siz[u] == maxx) ans.push_back(t[u].val);
    }
}
int main()
{
    while(scanf("%d", &N) && N)
    {
        tot = 0; root = 0;
        t[root].clear();
        for(int i=1; i<=N; i++)
        {
            scanf("%s", s[i]);
            Insert(i);
        }
        build_fail();
        for(int i=0; i<=tot; i++) { to[i].clear(); siz[i] = 0; }
        for(int i=1; i<=tot; i++) to[t[i].fail].push_back(i);
        scanf("%s", T);
        int u = root, len = (int)strlen(T);
        for(int i=0, id; i<len; i++)
        {
            id = T[i] - 'a';
            while(u && !t[u].nex[id]) u = t[u].fail;
            u = t[u].nex[id];
            siz[u]++;
        }
        maxx = 0; ans.clear();
        dfs(root);
        printf("%d\n", maxx);
        sort(ans.begin(), ans.end());
        for(int i : ans)
        {
            printf("%s\n", s[i]);
        }
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【模板】AC自动机(加强版)【AC自动机fail树上求最多出现次数】 的相关文章

  • 【Unity】一个简单的无限列表

    1 根据InfiniteElem 的高度和总个数 计算出Content的长度 2 根据Content所在的滚动位置 计算出当前哪些InfiniteElem显示在列表中 3 循环是生成的几个InfiniteElem显示列表内容 实现无限列表
  • LeetCode-1827. 最少操作使数组递增【贪心,数组】

    LeetCode 1827 最少操作使数组递增 贪心 数组 题目描述 解题思路一 简单暴力 解题思路二 优化1 ans是操作数 mx是当前最大元素 mx无论如何会依次递增 解题思路三 优化2 遇到小的数就pre 1 否则变为num 题目描述
  • C# 文件上传

    获取POST 请求发送的文件 并保存到服务器 HttpPostedFile file System Web HttpContext Current Request Files file 获取上载文件名称 string FileName fi
  • SoapUI、Jmeter、Postman三种接口测试工具的比较分析

    前段时间忙于接口测试 也看了几款接口测试工具 简单从几个角度做了个比较 拿出来与诸位分享一下 本文从多个方面对接口测试的三款常用工具进行比较分析 以便于在特定的情况下选择最合适的工具 或者使用自己编写的工具 不同工具定位不同 我们只是主要从
  • C语言之贪心算法疯牛

    疯牛 时间限制 1000 ms 内存限制 65535 KB 难度 4 描述 农夫 John 建造了一座很长的畜栏 它包括N 2 lt N lt 100 000 个隔间 这些小隔间依次编号为x1 xN 0 lt xi lt 1 000 000
  • Vant--移动端组件库

    Vant 是一个轻量 可靠的移动端组件库 于 2017 年开源 目前 Vant 官方提供了 Vue 2 版本 Vue 3 版本和微信小程序版本 并由社区团队维护 React 版本和支付宝小程序版本 文章目录 目录 文章目录 前言 一 优势
  • 轻松玩转Windows系统自带远程桌面及如何处理“出现了内部错误““0x4““0x7“等错误提示

    现在网络上的第三方远程协助软件很多 包括向日葵 ToDesk等等 但是 如果你遇到只有内网的情况下 或者外网速很差很慢 比如学校 或者禁止连外网的单位等等 使用第三方远程协助就很卡 甚至成了摆设 这种情况下 我们就需要用到Windows系统
  • Vert.x Web模块(六)

    SockJS SockJS是一个客户端JavaScript库和协议 SockJS提供类似WebSocket的接口 此接口允许与SockJS服务器建立连接 而不论浏览器或者网络允许真实的WebSockets SockJS通过支持浏览器与服务间
  • MySQL的浮点型和定点型解析和案例演示

    小数型 1 概述 浮点型和定点型 1 浮点数类型包括单精度浮点数 float型 和双精度浮点数 double型 定点数类型就是decimal型 2 两者区别 1 浮点型 小数点移动 精度有限 而且会丢失精度 系统自动四舍五入 4个字节 最大
  • web项目怎么放到云服务器上,web项目怎么放到云服务器上

    web项目怎么放到云服务器上 内容精选 换一换 伸缩组是具有相同属性和应用场景的云服务器和伸缩策略的集合 是启停伸缩策略和进行伸缩活动的基本单位 您可以使用伸缩策略设定的条件自动增加 减少伸缩组中的实例数量 或维持伸缩组中固定的实例数量 创
  • 用MySQL语法建 一个学生表,包括学生姓名、性别、年龄、班级信息。

    1 创建表的SQL语句 create table student ID int primary key not null NAME varchar 50 sex int age int classNO in 转载于 https www cn

随机推荐

  • SqlServer Management Studio启用身份验证登录

    背景 一开始安装好SqlServer Management Studio时 默认只能用本地window身份验证登录 也就是除了SqlServer的电脑 别的都访问不了这个数据库 这是很不方便的 方案 1 打开SqlServer Manage
  • ubuntu安装无线网卡驱动

    摘要 在笔记本上安装ubuntu系统 安装好后是可以连接wifi的 而台式机安装ubuntu的话 特别是组装的台式机 是无法立即连wifi的 是需要安装无线网卡驱动的 如果你身边无法连网线 而又无法连接wifi 根本无法更新或者下载 所以
  • https证书申请 nginx ssl配置

    打算开发api要弄一个https的域名 于是我就搞了一个把过程记录下来 留给有用的人 分割线 我用的是阿里云的证书 现在有一个免费的不知道以后会不会一直有 就在阿里云服务里CA证书服务就可以找到 购买的时候选择自动生成证书 这样就不用自己制
  • ionic5/angular11通过修改ShadowRoot样式更改ionic UI组件原样式

    通过浏览器调试可以找到需要更改的UI组件样式 找到其CSS class类名后 通过CSS无法直接修改样式 需要使用shadowRoot appendChild 方法注入新的样式覆盖原来的样式达到修改原样式的目的 一 编写HTML
  • 农行网银登录无法显示该网页_Edge Dev新版发布:支持网页预加载以更快搜索和浏览...

    今天早些时候 微软宣布了 Edge Dev 通道的最新 85 0 531 1 版本 本次版本更新支持某些网页的预加载 可以更快地搜索和浏览 该版本中还包含了一些BUG修复和改进 下载地址 https www microsoftedgeins
  • C#DataTable转List互转

    using System using System Collections Generic using System Data using System Reflection namespace BT Preservation Models
  • 疫情期间沙雕文案

    1 希望如约而至的不至是春天 还有疫情过后平安的你 2 早知道半个月前是最后一次出门 就不应该喝一杯奶茶 3 刚刚有人约我出去过情人节 我果断拉黑删除了 非常时期骗我感情可以 但要我名不可以 4 烟花三月下扬州 愿我三月能下楼 5 疫情你走
  • postman进行post、get参数传递及中文乱码和各类型参数传递和json格式传参和日期型参数传递和响应数据传回

    postman是一种测试工具 用postman直接在其上输入参数名和参数值就行 不用区分post和get请求方法 当然java代码要改变一点 在响应注解的方法里面添加和postman中输入的参数名一样的形参 get请求 代码 注意在响应注解
  • Android 9 底部导航栏样式不正确

    1 项目预制了GMS后 底部导航栏只剩下一个返回键和唤醒Assistant的按钮 需要回到原来的导航栏来 修改方式屏蔽掉 config defaultAssistantAccessPackage 使用Android原始的config def
  • 原码、补码、反码的关系及应用场景

    是三种表示有符号整数的方法 它们之间存在一定的关系 概念 原码是最基本的表示方法 即将一个数的符号位和数值位分开表示 符号位用0表示正数 用1表示负数 例如 7的原码为00000111 7的原码为10000111 反码是在原码的基础上 将负
  • 局域网、城域网、广域网、国际互联网(internet)

    计算机网络按覆盖范围分类可分为局域网 城域网 广域网 一 局域网 1 地理分布范较小 一般为数百米至数公里 可覆盖一幢大楼 一所校园或一个企业 一个家庭 2 数据传输速率高 一般为100Mbps 目前已出现速率高达1000Mbps的局域网
  • vue3 element-plus el-form的二次封装

    form表单的二次封装 vue3 element plus el form的二次封装 属性说明 属性名 类型 默认值 说明 data Array 页面展示数据内容 onChange Function false 表单事件 bindProps
  • R语言的科学编程与仿真 chapter 4 答案

    chapter 4 Ex1 programe cha4 6 ex1 Ex1 https img blog csdn net 20151226125117523 12 25 15 author Sigua file path file age
  • java 加载oracle 驱动 19c_037、Java--JDBC技术

    1 JDBC 简介 JDBC Java DataBase Connectivity java 数据库连接 是 JavaEE 平台下的技术规范 定义了在 Java 语言中连接数据 执行 SQL 语句的标准 可以为多种关系数据库提供统一访问 数
  • https认证过程(TLS认证过程)

    最近在准备春招 刚好看到https 网上搜了一圈没看到满意的 于是打算自己整理一下 以下内容来源于 计算机网络 第8版 谢希仁 加上了一些自己的拙见 目前的HTTPS是使用http tls的 所以直接了解tls的认证过程即可 曾经广泛使用的
  • SAP接口 财务凭证集成_差旅费报销

    OA系统调用此接口 传输差旅费报销流程的凭证信息到SAP 生成借款类型SAP凭证 调用标准的BABI方法实现 1 首先先介绍一下实现会计凭证生成的BAPI 参考链接 2 增强操作在另一篇文章 SAP接口 财务凭证集成 借款 在此不再赘述 3
  • 最近研究xcodebuild批量打包的一些心得

    转自Rainbird的个人博客 以前的时候只知道做安卓开发的兄弟挺辛苦的 不但开发的时候要适配一堆的机型 好不容易开发完了还要打一堆不同的包给不同的市场 没想到现在这些市场都开辟iOS市场 于是需要打一堆的包给不同的市场 面对暂时给的十二个
  • +-1 RMQ

    考虑分块 令 b log 2 n
  • [SQL系列] 从头开始学PostgreSQL 分库分表

    什么是分库分表 分库分表是一种数据库架构设计的方法 用于应对大规模数据的存储和查询 当单个数据库的存储容量或查询性能无法满足需求时 可以通过将数据分散存储在多个数据库服务器上 以提高系统的可扩展性和性能 分库分表通常包括两个步骤 分库和分表
  • 【模板】AC自动机(加强版)【AC自动机fail树上求最多出现次数】

    题目链接 P3796 给出N个模式串 然后我们用一个文本串去进行匹配 这样的做法 就是AC自动机了 于是乎 我们可以先将N个模式串丢进去 然后建立fail树 然后先对所有的节点求出最大串在文本串中出现的次数 然后利用dfs跑fail树的办法