当前位置: 首页 > news >正文

网站开发外快网站后台程序开发教程

网站开发外快,网站后台程序开发教程,贵阳做网站找哪家好,中国企业查询网官网话说AC自动机有什么用......我想要自动AC机 AC自动机简介#xff1a; 首先简要介绍一下AC自动机#xff1a;Aho-Corasick automation#xff0c;该算法在1975年产生于贝尔实验室#xff0c;是著名的多模匹配算法之一。一个常见的例子就是给出n个单词#xff0c;再给出一段…话说AC自动机有什么用......我想要自动AC机 AC自动机简介  首先简要介绍一下AC自动机Aho-Corasick automation该算法在1975年产生于贝尔实验室是著名的多模匹配算法之一。一个常见的例子就是给出n个单词再给出一段包含m个字符的文 章让你找出有多少个单词在文章里出现过。要搞懂AC自动机先得有字典树Trie和KMP模式匹配算法的基础知识。KMP算法是单模式串的字符匹配算 法AC自动机是多模式串的字符匹配算法。 AC自动机的构造 1.构造一棵Trie作为AC自动机的搜索数据结构。 2.构造fail指针使当前字符失配时跳转到具有最长公共前后缀的字符继续匹配。如 同 KMP算法一样 AC自动机在匹配时如果当前字符匹配失败那么利用fail指针进行跳转。由此可知如果跳转跳转后的串的前缀必为跳转前的模式串的后缀并且跳转的新位 置的深度匹配字符个数一定小于跳之前的节点。所以我们可以利用 bfs在 Trie上面进行 fail指针的求解。 3.扫描主串进行匹配。 AC自动机详讲 我们给出5个单词saysheshrheher。给定字符串为yasherhs。问多少个单词在字符串中出现过。 一、Trie 首先我们需要建立一棵Trie。但是这棵Trie不是普通的Trie而是带有一些特殊的性质。 首先会有3个重要的指针分别为p, p-fail, temp。 1.指针p指向当前匹配的字符。若p指向root表示当前匹配的字符序列为空。root是Trie入口没有实际含义。 2.指针p-failp的失败指针指向与字符p相同的结点若没有则指向root。 3.指针temp测试指针自己命名的容易理解~在建立fail指针时有寻找与p字符匹配的结点的作用在扫描时作用最大也最不好理解。 对于Trie树中的一个节点对应一个序列s[1...m]。此时p指向字符s[m]。若在下一个字符处失配即p-next[s[m1]] NULL则由失配指针跳到另一个节点(p-fail)处该节点对应的序列为s[i...m]。若继续失配则序列依次跳转直到序列为空或出现 匹配。在此过程中p的值一直在变化但是p对应节点的字符没有发生变化。在此过程中我们观察可知最终求得得序列s则为最长公共后缀。另外由于这个 序列是从root开始到某一节点则说明这个序列有可能是某些序列的前缀。 再次讨论p指针转移的意义。如果p指针在某一字符s[m1]处失配(即p-next[s[m1]] NULL)则说明没有单词s[1...m1]存在。此时如果p的失配指针指向root则说明当前序列的任意后缀不会是某个单词的前缀。如果p的失 配指针不指向root则说明序列s[i...m]是某一单词的前缀于是跳转到p的失配指针以s[i...m]为前缀继续匹配s[m1]。 对于已经得到的序列s[1...m]由于s[i...m]可能是某单词的后缀s[1...j]可能是某单词的前缀所以s[1...m]中可能会出现 单词。此时p指向已匹配的字符不能动。于是令temp p然后依次测试s[1...m], s[i...m]是否是单词。 构造的Trie为 二、构造失败指针 用BFS来构造失败指针与KMP算法相似的思想。 首先root入队第1次循环时处理与root相连的字符也就是各个单词的第一个字符h和s因为第一个字符不匹配需要重新匹配所以第一个字符都指 向rootroot是Trie入口没有实际含义失败指针的指向对应下图中的(1)(2)两条虚线第2次进入循环后从队列中先弹出h接下来p 指向h节点的fail指针指向的节点也就是rootpp-fail也就是pNULL说明匹配序列为空则把节点e的fail指针指向 root表示没有匹配序列对应图-2中的(3)然后节点e进入队列第3次循环时弹出的第一个节点a的操作与上一步操作的节点e相同把a的 fail指针指向root对应图-2中的(4)并入队第4次进入循环时弹出节点h(图中左边那个)这时操作略有不同。由于 p-next[i]!NULL(root有h这个儿子节点图中右边那个)这样便把左边那个h节点的失败指针指向右边那个root的儿子节点 h对应图-2中的(5)然后h入队。以此类推在循环结束后所有的失败指针就是图-2中的这种形式。 三、扫描 构造好Trie和失败指针后我们就可以对主串进行扫描了。这个过程和KMP算法很类似但是也有一定的区别主要是因为AC自动机处理的是多串模式需要防止遗漏某个单词所以引入temp指针。 匹配过程分两种情况(1)当前字符匹配表示从当前节点沿着树边有一条路径可以到达目标字符此时只需沿该路径走向下一个节点继续匹配即可目标 字符串指针移向下个字符继续匹配(2)当前字符不匹配则去当前节点失败指针所指向的字符继续匹配匹配过程随着指针指向root结束。重复这2个过程 中的任意一个直到模式串走到结尾为止。  对照上图看一下模式匹配这个详细的流程其中模式串为yasherhs。对于i0,1。Trie中没有对应的路径故不做任何操 作i2,3,4时指针p走到左下节点e。因为节点e的count信息为1所以cnt1并且讲节点e的count值设置为-1表示改单词已经 出现过了防止重复计数最后temp指向e节点的失败指针所指向的节点继续查找以此类推最后temp指向root退出while循环这个过程中 count增加了2。表示找到了2个单词she和he。当i5时程序进入第5行p指向其失败指针的节点也就是右边那个e节点随后在第6行指向r 节点r节点的count值为1从而count1循环直到temp指向root为止。最后i6,7时找不到任何匹配匹配过程结束。 到此AC自动机入门知识就讲完了。HDU 2222入门题必须果断A掉。bzoj3172也要A。 1 #includeiostream2 #includecstdio3 #includecstring4 #includecmath5 #includealgorithm6 #includequeue7 #includecstdlib8 #includeiomanip9 #includecassert 10 #includeclimits 11 #includevector 12 #includelist 13 #define maxn 1000001 14 #define F(i,j,k) for(int ij;ik;i) 15 #define M(a,b) memset(a,b,sizeof(a)) 16 #define FF(i,j,k) for(int ij;ik;i--) 17 #define inf 0x7fffffff 18 #define maxm 2016 19 #define mod 1000000007 20 //#define LOCAL 21 using namespace std; 22 int read(){ 23 int x0,f1;char chgetchar(); 24 while(ch0||ch9){if(ch-)f-1;chgetchar();} 25 while(ch0ch9){xx*10ch-0;chgetchar();} 26 return x*f; 27 } 28 int pos[maxn]; 29 struct AC_automation 30 { 31 int cnt; 32 int next[maxn][26],sum[maxn],fail[maxn],q[maxn]; 33 char ch[maxn]; 34 AC_automation() 35 { 36 cnt1; 37 F(i,0,25) next[0][i]1; 38 } 39 void insert(int pos) 40 { 41 int now1; 42 cinch; 43 int lenstrlen(ch)-1; 44 F(i,0,len){ 45 if(!next[now][ch[i]-a]) next[now][ch[i]-a]cnt; 46 nownext[now][ch[i]-a]; 47 sum[now]; 48 } 49 posnow; 50 } 51 void build_fail() 52 { 53 int head0,tail1; 54 q[0]1; 55 fail[1]0; 56 while(headtail) 57 { 58 int nowq[head]; 59 head; 60 F(i,0,25){ 61 int vnext[now][i]; 62 if(!v) continue; 63 int kfail[now]; 64 while(!next[k][i]) kfail[k]; 65 fail[v]next[k][i]; 66 q[tail]v; 67 } 68 } 69 FF(i,tail-1,0){ 70 sum[fail[q[i]]]sum[q[i]]; 71 } 72 } 73 }ac; 74 long long n,m; 75 int main() 76 { 77 std::ios::sync_with_stdio(false);//coutsetiosflags(ios::fixed)setprecision(1)y; 78 #ifdef LOCAL 79 freopen(data.in,r,stdin); 80 freopen(data.out,w,stdout); 81 #endif 82 cinn; 83 F(i,1,n){ 84 ac.insert(pos[i]); 85 } 86 ac.build_fail(); 87 F(i,1,n){ 88 coutac.sum[pos[i]]endl; 89 } 90 return 0; 91 } bzoj 3172  转载于:https://www.cnblogs.com/SBSOI/p/5681998.html
http://wiki.neutronadmin.com/news/102958/

相关文章:

  • 网站关键词的选择江南大学做网站
  • 物流网站推广怎么做西安自适应网站建设
  • 广州可以做票务商城的网站公司那些网站平台可以做3d建模
  • 怎么样免费建网站wordpress广告插件
  • 美食网站网页设计国际域名注册查询
  • 深圳建筑公司排行榜四川短视频seo优化网站
  • 备案 网站错了中国域名拍卖网
  • 内容网站模板网站开发教程收费版
  • 电脑做网站教学php构建网站如何开始
  • 笋岗网站建设个人主页的html设计
  • 响应式网站一般做多大长春微信网站建设
  • 百度地图嵌入公司网站建建设人才市场官方网站
  • 大学生实训网站建设心得建设网站怎么搞
  • 做做网站需要多少钱网站制作方案模板
  • 国外vi设计网站全国工商企业查询官网
  • 官方网站建设调研报告海口h5建站
  • 服装设计网站哪个好中山百度网站排名
  • 国外网站谷歌seo推广编程教程免费视频
  • 宁夏网站营销推广织梦网站怎么修改内容
  • 邯郸市建设局网站政策阿里巴巴网站建设缺点
  • 给小孩子做网站什么是搜索引擎优化用一句话概括
  • 营销型网站建设 课程做电影网站会被捉吗
  • 网站内页怎样做优化百姓网二手房
  • wordpress可以做电影网站吗网页设计形考作业2
  • 网站备案登录密码找回在线编辑图片的网站有哪些
  • 东营企业网站建设wordpress长文章自动分页
  • 网站建设的项目总结网站建设的基本流程可分为
  • 生意宝做网站行吗vs2008不能新建网站
  • 网站开发如何共用菜单栏宜宾市珙县住房城乡建设网站
  • 竹中建设官方网站wordpress配置qq邮箱