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的更多相关文章

  1. [POJ 1204]Word Puzzles(Trie树暴搜&amp;AC自己主动机)

    Description Word puzzles are usually simple and very entertaining for all ages. They are so entertai ...

  2. HDOJ 5421 Victor and String 回文串自己主动机

    假设没有操作1,就是裸的回文串自己主动机...... 能够从头部插入字符的回文串自己主动机,维护两个last点就好了..... 当整个串都是回文串的时候把两个last统一一下 Victor and S ...

  3. hdoj 2222 Keywords Search 【AC自己主动机 入门题】 【求目标串中出现了几个模式串】

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  4. hdu5384 AC自己主动机模板题,统计模式串在给定串中出现的个数

    http://acm.hdu.edu.cn/showproblem.php?pid=5384 Problem Description Danganronpa is a video game franc ...

  5. Hdu 3341 Lost&#39;s revenge (ac+自己主动机dp+hash)

    标题效果: 举个很多种DNA弦,每个字符串值值至1.最后,一个长字符串.要安排你最后一次另一个字符串,使其没事子值和最大. IDEAS: 首先easy我们的想法是想搜索的!管她3721..直接一个字符 ...

  6. Hdu 3962 Microgene (AC自己主动机+矩阵)

    标题效果: 构造一个字符串,使得有两个和两个以上的目标串.长短L这一系列有多少串都. IDEAS: 只有全款减有1一些字符串,没有目标就是答案. 假定数据是非常小的,够用dp解.dp[i][j][k] ...

  7. Codeforces 86C Genetic engineering (AC自己主动机+dp)

    题目大意: 要求构造一个串,使得这个串是由所给的串相连接构成,连接能够有重叠的部分. 思路分析: 首先用所给的串建立自己主动机,每一个单词节点记录当前节点可以达到的最长后缀. 開始的时候想的是dp[i ...

  8. Hdu 2457 DNA repair (ac自己主动机+dp)

    题目大意: 改动文本串的上的字符,使之不出现上面出现的串.问最少改动多少个. 思路分析: dp[i][j]表示如今 i 个字符改变成了字典树上的 j 节点. 然后顺着自己主动机一直转移方程. 注意合法 ...

  9. 字符串算法之 AC自己主动机

    近期一直在学习字符串之类的算法,感觉BF算法,尽管非常easy理解,可是easy超时,全部就想学习其它的一些字符串算法来提高一下,近期学习了一下AC自己主动机.尽管感觉有所收获,可是还是有些朦胧的感觉 ...

随机推荐

  1. DIV+CSS 入门

    玩一小会儿前csdn什么时候,页面上的加qq而微博,我认为这是美好的.牛腩完成.运营商也开始了他真正的学习B/S之旅. 刚開始的时候,我不知道<div>是什么 也不清楚CSS用来干什么的, ...

  2. 【译】ASP.NET MVC 5 教程 - 10:添加验证

    原文:[译]ASP.NET MVC 5 教程 - 10:添加验证 在本节中,我们将为Movie模型添加验证逻辑,并确认验证规则在用户试图使用程序创建和编辑电影时有效. DRY 原则 ASP.NET M ...

  3. Hdu 4539 【状态DP】.cpp

    题意: 一个炮兵可以攻打和他之间曼哈顿距离为2的士兵,给出你一块n*m的战场,告诉你哪些地方可以站人哪些地方不可以,问你最多可以安放多少个士兵? n <= 100, m <= 10 思路: ...

  4. SSM框架理解(转)

    SSM框架理解 最近两星期一直在学JavaEE的MVC框架,因为之前学校开的JavaEE课程就一直学的吊儿郎当的,所以现在真正需要掌握就非常手忙脚乱,在此记录下这段时间学习的感悟,如有错误,希望大牛毫 ...

  5. SVN常见问题及解决方案

    . 隐藏文件.svn目录删除了怎么办 Checkout后,工作空间下.svn目录下有大量隐藏文件,占用比较大的空间,他们是工作空间的管理文件,不能删除,如果不小心删除了也不要抓狂,不会影响服务器端的, ...

  6. BZOJ 3531: [Sdoi2014]旅游

    职务地址:http :// www . lydsy . com / JudgeOnline / problem . php ? id = 3531 标题效果:看到原来的标题. 算法讨论:树链拆分. 就 ...

  7. QVector&lt;QString&gt; 显示器里面的动态数组元素QString和char *转变

    QVector类是一类提供了动态数组模板. QVector<T>是Qt普通容器类的一种. 它将自己的每个对象存储在连续的内存中.能够使用索引號来高速訪问它们.QList<T>. ...

  8. 简说一下coffeescript的constructor是如何导致Backbone.View的事件无法正常工作的.

    在继承方面,js还是弱项呀.发现在继承的时候constructor和initialize之分.网上文章没有说明二者关系.看了源码才发现二者的区别呀. 首先我用coffeescript来实现js的继承, ...

  9. .net Work Flow 4.0

    工作流 依据 WfMC 的定义.工作流(WorkFlow)就是自己主动运作的业务过程部分或总体.表现为參与者对文件.信息或任务依照规程採取行动,并令其在參与者之间传递.官方的总是非常抽象,抽象是为了可 ...

  10. iOS: NSMutableArray的方法removeObject:inRange:

    - (void)removeObject:(id)anObject inRange:(NSRange)aRange