自己主动机串标:Directed Acyclic Word Graph
trie -- suffix tree -- suffix automa 有这么几个情况:
用户输入即时响应AJAX搜索框, 显示候选名单。
搜索引擎keyword统计数量。
后缀树(Suffix Tree): 从根到叶子表示一个后缀。
只从这一个简单的描写叙述,我们能够概念上解决以下的几个问题:
P:查找字符串o是否在字符串S中
A:若o在S中,则o必定是S的某个后缀的前缀。 用S构造后缀树。按在trie中搜索字串的方法搜索o就可以。
P: 指定字符串T在字符串S中的反复次数。
A: 假设T在S中反复了两次,则S应有两个后缀以T为前缀,搜索T节点下的叶节点数目即为反复次数。
P: 字符串S中的最长反复子串。
A: 同上。找到最深的非叶节点T。
P: 两个字符串S1。S2的最长公共子串。
A: 广义后缀树(Generalized Suffix Tree)存储_多个_字符串各自的全部后缀。把两个字符串S1#。S2$增加到广义后缀树中,然后同上。
(A longest substring common to s1 and s2 will be the path-label of an internal node with the
greatest string depth in the suffix tree which has leaves labelled with suffixes from both the
strings.)
Suffix Automa: 识别文本全部子串的辅助索引结构。
以下的代码是直接翻译[1]中算法A:
/*Directed Acyclic Word Graph */
#include <stdlib.h>
#include <string.h> typedef struct State{
struct State *first[26], *second[26];
struct State *suffix;
}State; State *sink, *source; State *new_state(void)
{
State *s = malloc(sizeof *s);
if(s){
memset(s, 0, sizeof *s);
}
return s;
} /*state:
parent -- [x] with xa = tail(wa)
child -- [tail(wa)]
new child -- [tail(wa)]_{wa}
*/
State *split(State *parent, int a)
{
int i;
/*current state, child, new child*/
State *cs = parent, *c = parent->second[a], *nc = new_state(); //S1
parent->first[a] = parent->second[a] = nc; //S2
for(i = 0; i < 26; ++i){
nc->second[i] = c->second[i]; //S3
}
nc->suffix = c->suffix; //S4
c->suffix = nc; //S5 for(cs = parent; cs != source; ){//S6,7
cs = cs->suffix; //S7.a
for(i = 0; i < 26; ++i){
if(cs->second[i] == c)cs->second[i] = nc; //S7.b
else goto _out; //S7.c
}
}
_out:
return nc; //S8
} /*state:
new sink -- [wa]
*/
void update(int a)
{
/*suffix state, current state, new sink*/
State *ss = NULL, *cs = sink, *ns = new_state(); //U1,2
sink->first[a] = ns; while(cs != source && ss == NULL){//U3
cs = cs->suffix; //U3.a
if(!cs->first[a] && !cs->second[a]){
cs->second[a] = ns; //U3.b.1
}else if(cs->first[a]){
ss = cs->first[a]; //U3.b.2
}else if(cs->second[a]){
ss = split(cs, a); //U3.b.3
}
} if(ss == NULL){ss = source;} //U4
ns->suffix = ss; sink = ns; //U5
} int build_dawg(char *w)
{
sink = source = new_state();
for(; *w; ++w){update(*w-'a');}
}
我还在努力理解中,没有測试。
[1] the smallest automation recognizing the subwords of a text
https://cbse.soe.ucsc.edu/sites/default/files/smallest_automaton1985.pdf
版权声明:本文博客原创文章,博客,未经同意,不得转载。
自己主动机串标:Directed Acyclic Word Graph的更多相关文章
- [POJ 1204]Word Puzzles(Trie树暴搜&AC自己主动机)
Description Word puzzles are usually simple and very entertaining for all ages. They are so entertai ...
- HDOJ 5421 Victor and String 回文串自己主动机
假设没有操作1,就是裸的回文串自己主动机...... 能够从头部插入字符的回文串自己主动机,维护两个last点就好了..... 当整个串都是回文串的时候把两个last统一一下 Victor and S ...
- hdoj 2222 Keywords Search 【AC自己主动机 入门题】 【求目标串中出现了几个模式串】
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- hdu5384 AC自己主动机模板题,统计模式串在给定串中出现的个数
http://acm.hdu.edu.cn/showproblem.php?pid=5384 Problem Description Danganronpa is a video game franc ...
- Hdu 3341 Lost's revenge (ac+自己主动机dp+hash)
标题效果: 举个很多种DNA弦,每个字符串值值至1.最后,一个长字符串.要安排你最后一次另一个字符串,使其没事子值和最大. IDEAS: 首先easy我们的想法是想搜索的!管她3721..直接一个字符 ...
- Hdu 3962 Microgene (AC自己主动机+矩阵)
标题效果: 构造一个字符串,使得有两个和两个以上的目标串.长短L这一系列有多少串都. IDEAS: 只有全款减有1一些字符串,没有目标就是答案. 假定数据是非常小的,够用dp解.dp[i][j][k] ...
- Codeforces 86C Genetic engineering (AC自己主动机+dp)
题目大意: 要求构造一个串,使得这个串是由所给的串相连接构成,连接能够有重叠的部分. 思路分析: 首先用所给的串建立自己主动机,每一个单词节点记录当前节点可以达到的最长后缀. 開始的时候想的是dp[i ...
- Hdu 2457 DNA repair (ac自己主动机+dp)
题目大意: 改动文本串的上的字符,使之不出现上面出现的串.问最少改动多少个. 思路分析: dp[i][j]表示如今 i 个字符改变成了字典树上的 j 节点. 然后顺着自己主动机一直转移方程. 注意合法 ...
- 字符串算法之 AC自己主动机
近期一直在学习字符串之类的算法,感觉BF算法,尽管非常easy理解,可是easy超时,全部就想学习其它的一些字符串算法来提高一下,近期学习了一下AC自己主动机.尽管感觉有所收获,可是还是有些朦胧的感觉 ...
随机推荐
- Trie图和Fail树
Trie图和AC自动机的区别 Trie图是AC自动机的确定化形式,即把每个结点不存在字符的next指针都补全了.这样做的好处是使得构造fail指针时不需要next指针为空而需要不断回溯. 比如构造ne ...
- A Game of Thrones(4) - Eddard
The visitors poured(倾泻:流出) through the castle gates in a river of gold and silver and polished steel ...
- Android - 位置定位(Location)服务(Service)类的基本操作
位置定位(Location)服务(Service)类的基本操作 本文地址: http://blog.csdn.net/caroline_wendy 定位服务(Location Service),能够确 ...
- 蚁群算法 matlab程序(已执行)
下面是解放军信息project大学一个老师编的matlab程序,请尊重原作者劳动,引用时请注明出处. 我经过改动添加了凝视,已经执行过,无误, function [R_best,L_best,L_av ...
- iOS一些推荐的学习路径发展
iOS论坛里有朋友要求回答帖子,帖子的标题是: 想学IOS开发高阶一点的东西,从何開始,然后我吧啦吧啦回答写了非常多.既然敲了那么多字,我就把我写的回复也贴到博客里来分享.希望能对大家有帮助.欢迎大家 ...
- crashRpt用法
从官网上下载crashRpt的源代码,按说明编译出对应的lib和dll 1 在编译crashRpt的时候,在环境变量中设置 crashrptDir=D:\work\AIW\WebMicaps\Web ...
- 使用装饰器模式动态设置Drawable的ColorFilter
使用装饰器模式动态设置Drawable的ColorFilter 欢迎各位关注我的新浪微博:微博 转载请标明出处(kifile的博客) 非常多时候我们都希望Android控件点击的时候,有按下效果,选中 ...
- hdu3709(数位dp)
求区间[l,r]内有多少个数的满足: 选一个位为中点,是的左边的数到该位的距离等于右边的位到该位的距离. 比如4139 选择3位中点, 那么左边的距离是 4 * 2 + 1 * 1 , 右边的距 ...
- python学习笔记之三:字典,当索引不好用时
字典是python中唯一内建的映射类型.字典中的值并没有特殊的顺序,但是都存储在一个特定的键(key)里.键可以是数字,字符串甚至是元组. 1. 创建和使用字典 字典可以通过下面的方式创建: phon ...
- Mercurial简介
前言 目前所在的公司的版本控制使用的是Mercurial,它也有一个对应的客户端小乌龟,但是Mercurial跟我们之前使用的SVN有着本质的区别,对于其区别会在下一篇中介绍到,这次主要是带领 ...