自动机

『Forensic Examination 后缀自动机 线段树合并』

情到浓时终转凉″ 提交于 2020-01-16 20:09:04
CF666E Forensic Examination Description 给你一个串 \(S\) 以及一个字符串数组 \(T[1..m]\) , \(q\) 次询问,每次问 \(S\) 的子串 \(S[p_l..p_r]\) 在 \(T[l..r]\) 中的哪个串里的出现次数最多,并输出出现次数。 如有多解输出最靠前的那一个。 Input Format The first line contains the string $ s $ ( $ 1<=|s|<=5·10^{5} $ ) — the Absolutely Inadmissible Swearword. The string $ s $ consists of only lowercase English letters. The second line contains the only integer $ m $ ( $ 1<=m<=5·10^{4} $ ) — the number of texts of leaflets for expertise. Each of the next $ m $ lines contains the only string $ t_{i} $ — the text of the $ i $ -th leaflet. The sum of lengths of all

AC自动机算法详解

流过昼夜 提交于 2020-01-16 05:09:53
说明转载出处:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 感谢大牛的博客!! 首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。 如果你对KMP算法和了解的话,应该知道KMP算法中的next函数(shift函数或者fail函数)是干什么用的。KMP中我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前 j个字符,当A[i+1]≠B[j+1],KMP的策略是调整j的位置(减小j值)使得A[i-j+1..i]与B[1..j]保持匹配且新的B[j+1]恰好与A[i+1]匹配,而next函数恰恰记录了这个j应该调整到的位置。同样AC自动机的失败指针具有同样的功能,也就是说当我们的模式串在Tire上进行匹配时,如果与当前节点的关键字不能继续匹配的时候

$AC$自动机

ぃ、小莉子 提交于 2020-01-11 02:02:10
直到现在才发现我对 \(AC\) 自动机还是一知半解(爆论 前期储备知识: 字典树 \(trie\) 单模式串匹配 \(KMP\) \(AC\) 自动机看起来很高大上( 仿佛 考场上每道题写AC​自动机都能过 )。但其实上 \(AC\) 自动机不过是将 \(KMP\) 套在 \(trie\) 上(形象化来讲,即具体实现是利用这两种算法的思想,实际上从定义出发并不相同) 首先,当我们手头有 \(N\) 个模式串时,我们仿照 \(KMP\) 的思想,对于第 \(x\) 个模式串的任意一个位置 \(pos\) ,找到最大的在这 \(N\) 个模式串的前缀 \([start:]\) 中出现过的后缀 \([:pos]\) ,即 \([start_s:]^{s}=[:pos]^{s_x}\) 但往下深入思考的时候,我们将遇到一个棘手的问题 \[如果那个最长的前缀同时出现在多个模式串中怎么办?\\这样我们并不知道应该从哪个模式串的前缀末尾开始匹配\] 那怎么办呢?于是我们自然而然就能想到 用 \(trie\) 把这些相同的前缀合并起来,这样就解决了我们之前遇到的问题。 接下来,问题少年又开始提问题了。那你每次插入一个模式串都需要把前面的 \(fail\) 指针重建(因为会出现更长的前缀匹配前面的后缀),复杂度不是爆炸了吗?所以我们 必须在所有模式串插入完成后在一起建 \(fail\) 指针

P5840 [COCI2015]Divljak【AC自动机+fail树+树上乱搞】

泄露秘密 提交于 2020-01-10 06:23:28
https://www.luogu.com.cn/problem/P5840 题意:中文题,给你n个串,然后m次操作,两种操作。 1操作,集合T加入一个串。2操作,询问集合T中出现上面的n个串的第i个几次。 首先听说解法挺多的,如果有幸学会了,后来补上吧。 做法:这里用AC自动机做吧,首先对n个串建立AC自动机,建立fail树,然后每一次往T集合中加入一个字符串,就让他到AC自动机中跑,跑到的点对应到fail树上点到根上的串表示都出现了,但不过一次加入中只每个点最多只能加1,因此需要去重,同时对于同一条链上点,需要利用DFS序加LCA处理一下。统计的时候就用树状数组吧。 下面这份代码可能写丑了,不开O2勉强卡过去。 # include "bits/stdc++.h" using namespace std ; inline int read ( ) { int x = 0 ; bool f = 1 ; char c = getchar ( ) ; for ( ; ! isdigit ( c ) ; c = getchar ( ) ) if ( c == '-' ) f = 0 ; for ( ; isdigit ( c ) ; c = getchar ( ) ) x = ( x << 3 ) + ( x << 1 ) + c - '0' ; if ( f ) return x ;

atitit.词法分析原理 词法分析器 (Lexer)

♀尐吖头ヾ 提交于 2020-01-09 12:56:38
atitit. 词法分析 原理 词法分析器 (Lexer) 1 . 词法分析 (英语: lexical analysis ) 1 2 . ;实现词法分析程序的常用途径 : 自动生成 , 手工生成 . [1] 2 2 .1. 词法分析程序的功能 2 2 .2. 如何描述词素 3 2 .3. 单词 token 3 2 .4. Token 的类型 ,根据程序设计语言的特点,单词可以分为五类:关键字、标识符、常量、运算符、界符。以 4 2 .5. 词法分析 的第一阶段即扫描器 4 2 .6. 词法分析 的第 二 阶段 评估器( Evaluator ) 5 2 .7. 例如 C语言程序段的词法分析结果 5 2 .8. 最长原则 6 2 .9. 词法单元的识别 6 2 .10. 不确定 ” ( Nondeterministic Finite Automata ,NFA 8 2 .11. 转换图(transition graph)的表示 9 2 .12. 词法分析 (3)---DFA 10 2 .13. 为什么要 NFA 转 DFA 12 2 .14. 则表达式转 NFA 13 2 .15. 正则表达式如何转换为NFA呢?有几个公式 (MLS2007[1]): 13 2 .16. 构造词法分析器了。大致的流程如下: 19 2 .17. 常用的 token scanner 19 2 .18.

C# 词法分析器(三)正则表达式

南楼画角 提交于 2020-01-09 02:01:14
系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 正则表达式是一种描述词素的重要表示方法。虽然正则表达式并不能表达出所有可能的模式(例如“由等数量的 a 和 b 组成的字符串”),但是它可以非常高效的描述处理词法单元时要用到的模式类型。 一、正则表达式的定义 正则表达式可以由较小的正则表达式按照规则递归地构建。每个正则表达式 $r$ 表示一个语言 $L(r)$,而语言可以认为是一个字符串的集合。正则表达式有以下两个基本要素: $\epsilon$ 是一个正则表达式, $L( \epsilon ) = { \epsilon }$,即该语言只包含空串(长度为 0 的字符串)。 如果 $a$ 是一个字符,那么 $\bf{ a }$ 是一个正则表达式,并且 $L( \bf{a} ) = \{ a \}$,即该语言只包含一个长度为 $1$ 的字符串 $a$。 由小的正则表达式构造较大的正则表达式的步骤有以下四个部分。假定 $r$ 和 $s$ 都是正则表达式,分别表示语言 $L(r)$ 和 $L(s)$,那么: $(r)|(s)$ 是一个正则表达式,表示语言 $L(r) \cup L(s)$,即属于 $L(r)$ 的字符串和属于 $L(s)$ 的字符串的集合( $L(r) \cup L(s) =

编译原理知识

╄→гoц情女王★ 提交于 2020-01-08 01:12:38
1、将表达式翻译成后缀式 https://zhidao.baidu.com/question/421915764.html 2、绪论   指令格式:操作码 操作地址码   低级语言:机器语言、汇编语言   翻译:逻辑等价的程序语言转变、编译:专指高级语言一次性转化为低级语言、解释:高级语言的一解释一执行   编译程序工作过程一般可分为五个阶段:词法分析、语法分析、语义分析、优化和目标代码生成,同时伴随表格管理和出错处理   编译有自编译和交叉编译 3、词法分析   任务:从左到右逐个字符地对源程序进行扫描,产生一个个单词 (Token)符号,输入源程序,输出单词符号(流),需要不断访问、更新符号表   符号分类:保留字、标识符、常数、运算符、界符   输出为二元式:(单词种别,单词自身的值/内码值)   状态转换图     作用:识别单词     定义:状态转换图是 状态有限的有向图 ,结点代表 状态 ,用圆圈表示;结 点之间可由有向边连接,代表 状态转换关系 ,有向边上可标 记 字符 ,表示前一状态接受某一个字符之后的状态转移     状态转换图的表示:       • 初始状态用“ ->○”表示 • 非终止状态用“○”表示 • 状态之间的跳转用“ ”(有向边)表示 • 终止状态用“◎*”表示       含分支的状态 • 对应一个switch()语句 • 或对应一组if

字符串练习题

故事扮演 提交于 2020-01-05 14:46:35
https://vjudge.net/contest/278181 写在前面: 1)一个子串既是一个后缀的前缀,又是一个前缀的后缀 2)AC自动机/后缀数组后常接DP/数据结构 Problem 0 Long Long Message (后缀数组) http://poj.org/problem?id=2774 思路: 两个字符串拼起来,求后缀数组和height数组 记录一下该后缀是从第一个字符串开始的还是第二个字符串开始的 对于从不同字符串开始的相邻位置的后缀 ans=max(height)(height表示的两个相邻后缀的起始位置为不同字符串才对答案有贡献) 为了避免从第一个字符串开始的后缀延伸到第二个字符串,造成结果可能会大,我们可以算各项结果时与在第一个字符串内长度取min,或者在两个字符串接起来的时候在中间加一个不可能被匹配的其他字符 Problem1 [BJWC2011]禁忌 (AC自动机) https://www.lydsy.com/JudgeOnline/problem.php?id=2553 https://www.luogu.org/problemnew/show/P4569 思路:f[i][j]表示已把前i位填好,走到AC自动机上j这个节点所有方案价值总和 枚举第i+1个位置填哪个字符 f[i][j]-> f[i+1][trans[j][k]] -> f[i+1]

编译原理DFA(有限确定自动机)的构造

﹥>﹥吖頭↗ 提交于 2020-01-05 01:37:58
CODE: https://github.com/pxjw/Principles-of-Compiler/tree/master/consDFA 原题: 1、自己定义一个简单语言或者一个右线性正规文法 示例如( 仅供参考 ) G[S]:S→aU|bV U→bV|aQ V→aU|bQ Q→aQ|bQ|e 2、构造其有穷确定自动机,如 3、利用有穷确定自动机M=(K,Σ,f, S,Z)行为模拟程序算法,来对于任意给定的串,若属于该语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要么能停止并回答“不是” K:=S; c:=getchar; while c<>eof do {K:=f(K,c); c:=getchar; }; if K is in Z then return (‘yes’) else return (‘no’) 开始编程! 1.状态转换式构造类: current——当前状态 next——下一状态 class TransTile { public: char current; char next; char input; TransTile(char C,char I,char Ne){ current = C; next = Ne; input = I; } }; 2.DFA的构造类 此处包括DFA的数据集,字母表,以及过程P的定义。 包括了初始化,遍历转换

atitit.词法分析原理 词法分析器 (Lexer)

家住魔仙堡 提交于 2020-01-05 00:46:58
atitit. 词法分析 原理 词法分析器 (Lexer) 1 . 词法分析 (英语: lexical analysis ) 1 2 . ;实现词法分析程序的常用途径 : 自动生成 , 手工生成 . [1] 2 2 .1. 词法分析程序的功能 2 2 .2. 如何描述词素 3 2 .3. 单词 token 3 2 .4. Token 的类型 ,根据程序设计语言的特点,单词可以分为五类:关键字、标识符、常量、运算符、界符。以 4 2 .5. 词法分析 的第一阶段即扫描器 4 2 .6. 词法分析 的第 二 阶段 评估器( Evaluator ) 5 2 .7. 例如 C语言程序段的词法分析结果 5 2 .8. 最长原则 6 2 .9. 词法单元的识别 6 2 .10. 不确定 ” ( Nondeterministic Finite Automata ,NFA 8 2 .11. 转换图(transition graph)的表示 9 2 .12. 词法分析 (3)---DFA 10 2 .13. 为什么要 NFA 转 DFA 12 2 .14. 则表达式转 NFA 13 2 .15. 正则表达式如何转换为NFA呢?有几个公式 (MLS2007[1]): 13 2 .16. 构造词法分析器了。大致的流程如下: 19 2 .17. 常用的 token scanner 19 2 .18.