kmp,trie,AC全面解析.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
kmp,trie,AC全面解析

余姚中学 罗方炜 余姚中学 罗方炜 kmp 什么是子串: 对于一个字符串变量,例如“adereegfbw”,它的子串就是像“ader”这样可以从中找到的连续的字符串。 字符串“adereegfbw”本身也属于它本身最长的子串。 子串计算方法: ab的子串:a、b、ab共3个即(2+1)个,abc的子串:a、 b、 c、 ab、 bc、abc 共(3+2+1)个, 所以若字符串的长度为n,则子串的个数就是[n+(n-1)+.......+1]个,software中非空子串的个数就是8+7+....+1=36个, 如果包括空串,则应为37个。 kmp 串的模式匹配: 令s为主串,t为模式串(1..n, 1..m) 当匹配不成功的时候,我们希望主串在匹配的时候不回溯,而模式串能迅速的回溯到该重新匹配的地方 当s[i]!=t[j]时,对于之前的j-1个字符,有: s[i-j+1]s[i-j+2]..s[i-1]=t[1][t2]..t[j-1] (1) Kmp 那么,我们希望j回溯到k位置,能使得: s[i-k+1]s[i-k+2]..s[i-1]=t[1]t[2]..t[k-1] (kj) (2) 根据(1),我们得出: s[i-k+1]s[i-k+2]..s[i-1]=t[j-k+1]t[j-k+2]..t[j-1] (kj) (3) 由(2),(3)得: t[1]t[2]..t[k-1]=t[j-k+1]t[j-k+2]..t[j-1] (kj) (4) kmp 由此,串的模式匹配重点构造模式串t构造回溯的next数组,用于记录匹配失败后模式串回溯的位置 为了加速找next数组,可以采用压缩路径的方式next[i]=next[j] (具体写法要根据题目需求) kmp void getNext(){ next[0]=-1; //next数组0-n,包括n for(int i=0,j=-1; in; ){ if(j==-1 || str[i]==str[j]){ i++, j++; if(str[i]==str[j]) next[i]=next[j]; //一样的字符,如果要回溯,就递归回溯 else next[i]=j; //不然就回溯到j,意味着前j个一样 }else j=next[j]; } } kmp kmp 相关题目 Hdu2087 Hdu1358 (next数组应用) 任务:每人推荐一道。。。 trie Trie树(单词查找树,字典树) trie //结点数组写法 const int dig=26; const int M=500001; #define root 0; struct node{ int cnt,sun[dig]; //网上很多指针写法,省空间 void init(){ cnt=0; for(int i=0; idig; i++) sun[i]=-1; } }p[M]; int tot; trie void insert(char *s){ //建字典树 int j=root; for(int i=0; s[i]; i++){ int k=s[i]-a; if(p[j].sun[k]==-1){ p[tot].init(); p[j].sun[k]=tot++; } j=p[j].sun[k]; p[j].cnt++; //根据情况设计cnt } } trie trie 相关题目 Hdu1251 Pku 1204 (题意:给定一个字符矩阵,然后给你一些字符串,让你在矩阵里找出这个字符串,如果存在,输出第一个字符位置以及方向 (A-H从北开始顺时针八个方向) ) /vjudge/contest/view.action?cid=27276#overview 解法:对字符串构造trie树,然后枚举矩阵里每个点及八个方向,走一趟trie树,判断是否在trie上有cnt AC自动机 AC自动机可以说是kmp与trie树的结合 利用trie树的树形结构,在trie树上构造类似next的fail指针,表示匹配失败后回溯到树的哪个位置 Trie树就相当于模式串 AC自动机 AC自动机 AC自动机 KMP算法是单模式串的字符匹配算法,AC自动机是多模式串的字符匹配算法。 AC自动机的构造: 1.构造一棵Trie,作为AC自动机的搜索数据结构。 2.构造fail指针,使当前字符失配时跳转到具有最长公共前

文档评论(0)

liudao + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档