正题

ybtoj AC自动机-3


题目大意

给你一个字符串和若干匹配串,问你匹配串的前缀和字符串的最大匹配


解题思路

先把所有匹配串丢进AC自动机,然后拿字符串去跑

每次只在当前位置存下贡献,然后按bfs的倒叙传递贡献,最后再倒着跑每个匹配串


代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 10000010
using namespace std;
int n, w, hd, tl, len, q[N], b[N], d[N], v[N], nx[N], fa[N], to[N][4];
char s[N], ss[N];
int check(char g)
{if (g == 'E') return 0;if (g == 'S') return 1;if (g == 'W') return 2;if (g == 'N') return 3;
}
int insert(char* s)
{int now = 0, n = strlen(s+1);for (int i = 1; i <= n; ++i){int y = check(s[i]);if (!to[now][y]) to[now][y] = ++w;fa[to[now][y]] = now;q[to[now][y]] = q[now] + 1;now = to[now][y];}return now;
}
void bfs()
{for (int i = 0; i < 4; ++i)if (to[0][i]) d[++tl] = to[0][i];while(hd < tl){int h = d[++hd];for (int i = 0; i < 4; ++i)if (!to[h][i]) to[h][i] = to[nx[h]][i];else nx[to[h][i]] = to[nx[h]][i], d[++tl] = to[h][i];}return;
}
void ask(char* s)
{int now = 0;for (int i = 1; i <= len; ++i){int y = check(s[i]);now = to[now][y];b[now] = 1;}return;
}
int find(int x)//倒着跑匹配串
{while(x && !b[x]) x = fa[x];return q[x];
}
int main()
{scanf("%d%d", &len, &n);scanf("%s", ss+1);for (int i = 1; i <= n; ++i){scanf("%s", s+1);v[i] = insert(s);}bfs();ask(ss);for (int i = tl; i > 0; --i)b[nx[d[i]]] |= b[d[i]];//传递贡献for (int i = 1; i <= n; ++i)printf("%d\n", find(v[i]));return 0;
}

【AC自动机】前缀匹配(ybtoj AC自动机-3)相关推荐

  1. YBTOJ:前缀匹配(AC自动机)

    文章目录 题目描述 解析 代码 题目描述 解析 做的不错 把trie树真的当成一棵树递归即可 注意一个标记时的问题: void AC(){int l=strlen(s0+1),pl=1;for(int ...

  2. python使用esmre代替ahocorasick实现ac自动机[多模匹配]

    Toggle navigation Home saltstack ansible zabbix docker python Golang web开发 运维开发 运维 文艺 python使用esmre代 ...

  3. 【AC自动机】病毒代码(ybtoj AC自动机-5)

    正题 ybtoj AC自动机-5 题目大意 给出若干段01串,问你是否存在一个无限的01串,使得串中不存在给出的01串 解题思路 可以把给出01串用AC自动机处理,然后对每个01串的最后一位打上标记 ...

  4. 【AC自动机】屏蔽词删除(ybtoj AC自动机-4)

    正题 ybtoj AC自动机-4 题目大意 有一个字符串和若干要删除的串(不存在包含关系),每次从前往后搜,搜到第一个要删除的串然后删掉,再从0开始搜 问你最后得到的字符串 解题思路 先把所有删除串丢 ...

  5. 【AC自动机】单词(luogu 3966/ybtoj AC自动机-2)

    正题 luogu 3966 ybtoj AC自动机-2 题目大意 给你n个单词,让你查询这写单词分别在这n个单词中出现过多少次 解题思路 先用AC自动机建好图,然后每个点的权值为1,然后向nx传递 代 ...

  6. 【数据结构】自动机全家桶(AC、回文、后缀自动机)

    自动机全家桶 前言 一.AC自动机 1.优秀博客链接 2.问题模板 3.使用 4.本质 5.运用 6.代码模板 二.回文自动机(回文树) 1.优秀博客链接 2.问题模板 3.使用 4.本质 5.运用 ...

  7. 《深入浅出DPDK》读书笔记(六):报文转发(run to completion、pipeline、精确匹配算法、最长前缀匹配LPM)

    本文内容为读书笔记,摘自<深入浅出DPDK> 65.网络报文的处理和转发主要分为硬件处理部分与软件处理部分,由以下模块构成: ❑Packet input:报文输入. ❑Pre-proces ...

  8. hbase,根据前缀匹配进行搜索并分批次获取结果

    1,获取hbase client /*** Create a new Connection instance using the passed <code>conf</code> ...

  9. 【微信小程序】二维码跳转规则的前缀匹配是什么意思?

    前言 基础库 2.12.0 开发者工具 1.03.2008270 微信小程序的二维码跳转规则 为了方便小程序开发者更便捷地推广小程序,兼容线下已有的二维码,微信公众平台开放扫描普通链接二维码跳转小程序 ...

最新文章

  1. 02HTML标签(上)
  2. CentOS 6 安装 Git
  3. 图像质量损失函数SSIM Loss的原理详解和代码具体实现
  4. oracle中触发器的讲解
  5. LINQ标准查询操作符
  6. git命令行完全解读
  7. 居家学习的核心操作准则:45分钟的专注
  8. 二叉树-树转二叉树 使用队列,编写transfrom函数,将普通树转换成对应的二叉树。
  9. 应用ForkJoin –从最佳到快速
  10. 前端学习(1411):多人管理31数据分页2
  11. 菜单固定随滚动条滑动
  12. 原型模式 java 深浅_java学习笔记之原型模式及深浅拷贝
  13. jQuery Mobile 1.3.1 发布
  14. 入侵本地Mac OS X方针与技巧
  15. Spring data JPA图文教程(一)
  16. 【2022-10-19】让Mac QQ自带截图软件单独运行 / 节省大量系统内存 / 快捷截图 / ScreenCapture QQ/ QQ jietu plugin
  17. quartz 每月一次_Quartz 每月1号,执行规则表达式怎么列?
  18. 昆明计算机学校录取分数,云南省昆明铁路机械学校2021年招生录取分数线
  19. APICloud教程
  20. coding coffee HTML文档

热门文章

  1. 百度网页移动端html,百度移动端开始用网站品牌名代替网址显示
  2. yml php,使用 docker-compose.yml 快速搭建php开发环境
  3. pc模式 华为mate30_华为mate30与电脑连不上怎么回事
  4. 计算机算法音乐专业,音乐信号分析算法的乐理简说(非音乐专业的乐理)
  5. php curl 使用方法,php curl使用方法与步骤
  6. 杂牌手柄模拟xboxone手柄_手机就能玩Switch游戏,蛋蛋模拟器+盖世小鸡X2手柄体验...
  7. 数据库课设(足球联赛管理系统)
  8. [汇编语言]实验二:字的传送
  9. Cow Bowling POJ - 3176(基础的动态规划算法)
  10. string函数知识点总结