自动机

8.非确定的自动机NFA确定化为DFA

我与影子孤独终老i 提交于 2019-12-03 00:09:18
NFA 确定化为 DFA 子集法: f(q,a)={q1,q2,…,qn},状态集的子集 将{q1,q2,…,qn}看做一个状态A,去记录NFA读入输入符号之后可能达到的所有状态的集合。 步骤: 1.根据NFA构造DFA状态转换矩阵 ①确定DFA初态(NFA的所有初态集),字母表 ②从初态出发,经字母表到达的状态集看成一个新状态 ③将新状态添加到DFA状态集 ④重复23步骤,直到没有新的DFA状态 2.画出DFA 3.看NFA和DFA识别的符号串是否一致。 练习: 1.解决多值映射:子集法 1). 发给大家的图1 a b A 0 01 0 B 01 01 02 C 02 01 03 D 03 01 0 2). P64页练习3 2.解决空弧:对初态和所有新状态求ε-闭包 1). 发给大家的图2 0 1 2 0 ε{A}={ABC} ε{A}={ABC} ε{B}={BC} ε{C}={C} 1 {BC} ε{B}={BC} ε{C}={C} 2 {C} ε{C}={C} 2).P50图3.6 来源: https://www.cnblogs.com/linyanli/p/11757245.html

TZOJ 5986 玄武密码(AC自动机)

匿名 (未验证) 提交于 2019-12-02 23:55:01
描述 输入 之后M行,每行有一个字符串,描述了一段带有玄武密码的文字。依然满足,所有字符都满足是E,S,W和N中的一个。 对于100%的数据,N<=10^7,M<=10^5,每一段文字的长度<=100。 输出 样例输入 7 3 SNNSSNS NNSS NNN WSEE 样例输出 4 2 0 题意 如上。 题解 M个串建AC自动机,由于只有ESWN四个字符,所以只用开4,记录串i在AC自动机最后的位置id,并且记录父节点father和深度d。 查询S所能到达的所有节点,标记vis。 最后串i最后的位置id(叶子节点)往上跑,如果已经被标记输出dis。 时间复杂度O(N+100*M)。 代码 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int N=1e7+5,M=1e5+5; 5 int tot,son[N][4],father[N],fail[N],q[N],d[N],id[M]; 6 int n,m;char s[N],s1[N]; 7 bool vis[N]; 8 inline int get(char ch){ 9 if(ch=='E')return 0; 10 else if(ch=='S')return 1; 11 else if(ch=='W')return 2; 12 else return 3

反悔贪心

有些话、适合烂在心里 提交于 2019-12-02 23:53:26
目录: 个人理解 反悔贪心的分类 反悔自动机 反悔堆 例题简析及代码 一、个人理解: 贪心本身是没有反悔操作的,贪心求的就是当前的最优解。但当前的最优解有可能是局部最优解,而不是全局最优解,这时候就要进行反悔操作。 反悔操作 指的是这一步的贪心不是全局最优解,我们就退回去一步(人工或自动判断),换一种贪心策略。按照 判断方式 的不同可以分为 反悔自动机 和 反悔堆 两种方法。 二、反悔贪心的分类: 反悔自动机: 即设计一种反悔策略,使得 随便 一种贪心策略都可以得到正解。 基本的设计思路是:每次选择 直观上最接近全局最优解 的贪心策略,若发现最优解不对,就想办法 自动 支持反悔策略。(这就是自动机的意思) 具体题目具体分析。 反悔堆: 即通过 堆 (大根堆、小根堆)来维护当前贪心策略的最优解,若发现最优解不对,就退回上一步,更新最优解。 由于堆的性质,使得堆的 首数据 一定是最优的,这就可以实现 快速更新最优解 。 三、例题简析及代码 USACO09OPEN 工作调度Work Scheduling (反悔堆) Description : 有 \(n\) 项工作,每 \(i\) 项工作有一个截止时间 \(D_i\) ,完成每项工作可以得到利润 \(P_i\) ,求最大可以得到多少利润。 Method : 做这道题的时候并没有想到反悔贪心,只是想到一个错误的贪心算法

DFA和NFA的区别

匿名 (未验证) 提交于 2019-12-02 23:40:02
正则表达式引擎分成两类,一类称为 DFA(确定性有穷自动机) ,另一类称为 NFA(非确定性有穷自动机) 。两类引擎要顺利工作,都必须有一个正则式和一个文本串,一个捏在手里,一个吃下去。DFA捏着文本串去比较正则式,看到一个子正则式,就把可能的匹配串全标注出来,然后再看正则式的下一个部分,根据新的匹配结果更新标注。而NFA是捏着正则式去比文本,吃掉一个字符,就把它跟正则式比较,匹配就记下来:“某年某月某日在某处匹配上了!”,然后接着往下干。一旦不匹配,就把刚吃的这个字符吐出来,一个个的吐,直到回到上一次匹配的地方。 DFA与NFA机制上的不同带来5个影响: DFA对于文本串里的每一个字符只需扫描一次,比较快,但特性较少;NFA要翻来覆去吃字符、吐字符,速度慢,但是特性丰富,所以反而应用广泛,当今主要的正则表达式引擎,如Perl、Ruby、Python的re模块、Java和.NET的regex库,都是NFA的。 只有NFA才支持lazy和backreference等特性; NFA急于邀功请赏,所以最左子正则式优先匹配成功,因此偶尔会错过最佳匹配结果;DFA则是“最长的左子正则式优先匹配成功”。 NFA缺省采用greedy量词(见item 4); NFA可能会陷入递归调用的陷阱而表现得性能极差。 例如用正则式/perl|perlman/来匹配文本 ‘perlman book’

[BJOI2019]奥术神杖

匿名 (未验证) 提交于 2019-12-02 23:26:52
题目 我要是生在 \(bj\) 估计就凉了,一道 \(d1t1\) 做了 \(4h+\) 首先看到这个鬼畜的计算贡献的柿子 \[\prod_{i=1}^na_i^{\frac{b_i}{\sum_{j=1}^nb_j}}\] \(a_i\) 为第 \(i\) 个字符串的价值, \(b_i\) 为第 \(i\) 个字符串出现的次数 我们显然需要取一个 \(\ln\) 就变成了 \[\sum_{i=1}^n\frac{b_i}{\sum_{j=1}^nb_j}\ln a_i\] 这样写太难看了 我们随便一些就变成了 \[\frac{\sum_{i=1}^nb_i\ln a_i}{\sum_{i=1}^nb_i}\] 一看这不分数规划吗,我们直接二分一个 \(mid\) 看看答案是否能更大就好了 如果更大 \[\frac{\sum_{i=1}^nb_i\ln a_i}{\sum_{i=1}^nb_i}>mid\] 也就是 \[\sum_{i=1}^nb_i(\ln a_i-mid)>0\] 显然这又是一个多串匹配的问题,我们直接上 \(AC\) 自动机 现在的问题就是在自动机上找到一条长度为 \(n\) 的路径,点权和最大 直接在自动机上按位 \(dp\) 就好了, \(dp[i][j]\) 表示匹配的长度是 \(i\) 当前在自动机上的第 \(j\) 个节点的最大路径长度 代码

后缀自动机例题精讲

匿名 (未验证) 提交于 2019-12-02 23:26:52
版权声明:本博客中有原创标签的内容均为博主原创,转载请注明出处! https://blog.csdn.net/lleozhang/article/details/89413765 这一篇是后缀自动机的一些例题题解及总结: 例: bzoj 3998 题意:求一个字符串中第k小子串,t=0表示子串仅区别字典序,t=1表示子串区分起止位置 解析:建起后缀自动机,构造parent树,利用后缀自动机有向无环累计子串个数查询即可 具体解析: https://blog.csdn.net/lleozhang/article/details/89413818 bzoj 2780 题意:给出很多模板串和很多询问,每次询问求一个询问串在多少个模板串中出现过 解析:建起广义后缀自动机,构造parent树,求出dfs序,区间查询不同值的个数,离线HH的项链 具体解析: https://blog.csdn.net/lleozhang/article/details/89365183 bzoj 3277 题意:给出很多模板串,求每个串有多少子串是所有模板串中不少于k个串的子串 解析:建起广义后缀自动机,同bzoj 2780计算,将父节点贡献累计到子节点上 具体解析: https://blog.csdn.net/lleozhang/article/details/89387799 文章来源: https:/

第八次——非确定的自动机NFA确定化为DFA

流过昼夜 提交于 2019-12-02 22:33:14
NFA 确定化为 DFA 子集法: f(q,a)={q1,q2,…,qn},状态集的子集 将{q1,q2,…,qn}看做一个状态A,去记录NFA读入输入符号之后可能达到的所有状态的集合。 步骤: 1.根据NFA构造DFA状态转换矩阵 ①确定DFA初态(NFA的所有初态集),字母表 ②从初态出发,经字母表到达的状态集看成一个新状态 ③将新状态添加到DFA状态集 ④重复23步骤,直到没有新的DFA状态 2.画出DFA 3.看NFA和DFA识别的符号串是否一致。 练习: 1.解决多值映射:子集法 1). 发给大家的图1 2). P64页练习3 2.解决空弧:对初态和所有新状态求ε-闭包 1). 发给大家的图2 2).P50图3.6 来源: https://www.cnblogs.com/zzj420133722/p/11758143.html

08 非确定的自动机NFA确定化为DFA 10/30

喜夏-厌秋 提交于 2019-12-02 22:14:47
1.设有 NFA M=( {0,1,2,3}, {a,b},f,0,{3} ),其中 f(0,a)={0,1} f(0,b)={0} f(1,b)={2} f(2,b)={3} 画出状态转换矩阵,状态转换图,并说明该NFA识别的是什么样的语言。     2.NFA 确定化为 DFA 1.解决多值映射:子集法 1). 上述练习1的NFA     2). P64页练习3      2.解决空弧:对初态和所有新状态求ε-闭包 1). 发给大家的图2      2).P50图3.6      子集法: f(q,a)={q1,q2,…,qn},状态集的子集 将{q1,q2,…,qn}看做一个状态A,去记录NFA读入输入符号之后可能达到的所有状态的集合。 步骤: 1).根据NFA构造DFA状态转换矩阵 ①确定DFA的字母表,初态(NFA的所有初态集) ②从初态出发,经字母表到达的状态集看成一个新状态 ③将新状态添加到DFA状态集 ④重复23步骤,直到没有新的DFA状态 2).画出DFA 3).看NFA和DFA识别的符号串是否一致。 来源: https://www.cnblogs.com/jwwzone/p/11763862.html

非确定的自动机NFA确定化为DFA

余生长醉 提交于 2019-12-02 21:49:27
1.设有 NFA M=( {0,1,2,3}, {a,b},f,0,{3} ),其中 f(0,a)={0,1} f(0,b)={0} f(1,b)={2} f(2,b)={3} 画出状态转换矩阵,状态转换图,并说明该NFA识别的是什么样的语言。 2.NFA 确定化为 DFA 1.解决多值映射:子集法 1). 上述练习1的NFA 2). P64页练习3 2.解决空弧:对初态和所有新状态求ε-闭包 1). 发给大家的图2 2).P50图3.6 子集法: f(q,a)={q1,q2,…,qn},状态集的子集 将{q1,q2,…,qn}看做一个状态A,去记录NFA读入输入符号之后可能达到的所有状态的集合。 步骤: 1).根据NFA构造DFA状态转换矩阵 ①确定DFA的字母表,初态(NFA的所有初态集) ②从初态出发,经字母表到达的状态集看成一个新状态 ③将新状态添加到DFA状态集 ④重复23步骤,直到没有新的DFA状态 2).画出DFA 3).看NFA和DFA识别的符号串是否一致。 来源: https://www.cnblogs.com/fzwboke/p/11763835.html

非确定的自动机NFA确定化为DFA

拈花ヽ惹草 提交于 2019-12-02 21:49:13
1.设有 NFA M=( {0,1,2,3}, {a,b},f,0,{3} ),其中 f(0,a)={0,1} f(0,b)={0} f(1,b)={2} f(2,b)={3} 画出状态转换矩阵,状态转换图,并说明该NFA识别的是什么样的语言。 识别的语言为:(a|b)*abb 2. NFA 确定化为 DFA 1.解决多值映射:子集法 1). 上述练习1的NFA 2). P64页练习3 2.解决空弧:对初态和所有新状态求ε-闭包 1). 发给大家的图2 2).P50图3.6 子集法: f(q,a)={q1,q2,…,qn},状态集的子集 将{q1,q2,…,qn}看做一个状态A,去记录NFA读入输入符号之后可能达到的所有状态的集合。 步骤: 1).根据NFA构造DFA状态转换矩阵 ①确定DFA的字母表,初态(NFA的所有初态集) ②从初态出发,经字母表到达的状态集看成一个新状态 ③将新状态添加到DFA状态集 ④重复23步骤,直到没有新的DFA状态 2).画出DFA 3).看NFA和DFA识别的符号串是否一致。 来源: https://www.cnblogs.com/ccw1124486193/p/11763840.html