1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<string>
5 #include<queue>
6 #include<algorithm>
7 #include<cmath>
8 using namespace std;
9 const int MAX=1e6,TYPE=26;
10 struct ac_automation{
11 int trie[MAX][TYPE],num[MAX],tot,fail[MAX];
12 void readin(char * a)
13 {
14 int k=strlen(a),now=0;
15 for(int i=0;i<k;i++)
16 {
17 if(!trie[now][a[i]-'a'])
18 trie[now][a[i]-'a']=++tot;
19 now=trie[now][a[i]-'a'];
20 }
21 num[now]++;
22 }
23 void getfail()
24 {
25 queue<int> q;
26 memset(fail,0,sizeof(fail));
27 for(int i=0;i<TYPE;i++)
28 if(trie[0][i])
29 q.push(trie[0][i]);
30 while(!q.empty())
31 {
32 int k=q.front();
33 q.pop();
34 for(int i=0;i<TYPE;i++)
35 if(trie[k][i])
36 {
37 fail[trie[k][i]]=trie[fail[k]][i];
38 q.push(trie[k][i]);
39 }
40 else
41 trie[k][i]=trie[fail[k]][i];
42 }
43 }
44 int find(char *s)
45 {
46 int ans=0,p=0;
47 for(int i=0;s[i];i++)
48 {
49 p=trie[p][s[i]-'a'];
50 for(int j=p;j and ~num[j];j=fail[j]) ans+=num[j],num[j]=-1;
51 }
52 return ans;
53 }
54 }ac;
55 char str[MAX],tem[MAX];
56 int main()
57 {
58 int k;
59 scanf("%d",&k);
60 for(int i=1;i<=k;i++)
61 {
62 scanf("%s",tem);
63 ac.readin(tem);
64 }
65 scanf("%s",str);
66 ac.getfail();
67 printf("%d",ac.find(str));
68 return 0;
69 }

二、一些结论

  1.x的fail指针指向的是x点在这个trie中代表的字符串的在这个trie中的最长后缀

  2.对于一个不在自动机中的字符串s,将其放到自动机中跑,最后停下来时,即到达s的最后一个字符时,假设此时在ac自动机中到了y节点,则y点代表的字符串就是s的最长的,是ac自动机中的字符串的前缀,的后缀。

  3.第一次失配的位置深度(=最长前缀),结束时所在节点深度(=最长后缀);

自动AC机qwq(大雾)以及trie图fail图的一些结论的更多相关文章

  1. Censoring【自动AC机】【水题毁我青春】【20190614】

    这题简直比注水猪肉还水QAQ. 以前做过KMP的Censoring单串匹配,果断选择自动AC机w 对短串建自动AC机 长串去机子里匹配 用个栈边匹配边弹出 记得弹出一个串后把匹配点指向栈顶就ojbk ...

  2. 关于自动AC机

    嗯,,,,自动AC机 在cena评测时: Const SourcePath:string='incantation'; InputFile:string='incantation.in'; Outpu ...

  3. 论自动AC机

    O(∩_∩)O哈哈~第一篇原创博客.终于结束了我“无敌转载王”的称号了!!!好开心! (⊙v⊙)嗯,看到标题觉得我是神犇的人,请再次仔细看看标题,是“自动AC”,而非“AC自动”哦!这是利用lemon ...

  4. 自动AC机

    可以在lemon和cena环境下使用. #include<iostream> #include<cstdio> #include<cstring> #include ...

  5. 继续node爬虫 — 百行代码自制自动AC机器人日解千题攻占HDOJ

    前言 不说话,先猛戳 Ranklist 看我排名. 这是用 node 自动刷题大概半天的 "战绩",本文就来为大家简单讲解下如何用 node 做一个 "自动AC机&quo ...

  6. 三极管的妙用之C118自动刷机

    首先咱们要搞清楚咱们自动刷机的原理,不谈修改固件那么高深的东西,简单的就是控制开机键. 使用继电器来控制基本上算是上个世纪的想法吧,之前博主也做过,做出来的感觉其实也很不错,就像是一个收藏品.因为继电 ...

  7. BZOJ 1704: [Usaco2007 Mar]Face The Right Way 自动转身机( 贪心 )

    贪心...先枚举k, 然后从左往右扫一遍, 发现位置p的牛的状态不符合就将 [p, p + k ) 的牛都转身, 假如p + k - 1 已经超过了最右边牛的位置那这个k就不符合要求. 符合要求的就可 ...

  8. 【bzoj1704】[Usaco2007 Mar]Face The Right Way 自动转身机 贪心

    题目描述 农夫约翰有N(1≤N≤5000)只牛站成一排,有一些很乖的牛朝前站着.但是有些不乖的牛却朝后站着.农夫约翰需要让所有的牛都朝前站着.幸运的是约翰最近买了一个自动转身机.这个神奇的机器能使K( ...

  9. [bzoj1704][Usaco2007 Mar]Face The Right Way 自动转身机_贪心

    Face The Right Way 自动转身机 bzoj-1704 Usaco-2007 Mar 题目大意:不想描述题意系列++... ...题目链接 注释:略. 想法:我们直接枚举k,然后从左往右 ...

随机推荐

  1. java拼接JSON串

    String str = "{\"route\":\"onGift\",\"time\":\"\",\&quo ...

  2. 使用 xunit 编写测试代码

    使用 xunit 编写测试代码 Intro xunit 是 .NET 里使用非常广泛的一个测试框架,有很多测试项目都是在使用 xunit 作为测试框架,不仅仅有很多开源项目在使用,很多微软的项目也在使 ...

  3. es6 快速入门 系列

    es6 快速入门(未完结,持续更新中...) 前言 为什么要学习es6 es6对于所有javaScript开发者来说,非常重要 未来,es6将构成javaScript应用程序的基础 es6中很多特性, ...

  4. java基础知识 + 常见面试题

    准备校招面试之Java篇 一. Java SE 部分 1.1 Java基础 1. 请你解释Object若不重写hashCode()的话,hashCode()如何计算出来的? Object 的 hash ...

  5. android消息线程和消息队列

    基于消息队列的线程通信:           消息队列与线程循环            MessageQueue:           利用链表来管理消息.                  Mess ...

  6. dex、apk完整性校验

    对Dex进行完整性的检查,可通过CRC,或者Hash值.可将校验值放到String资源文件里,或者放到服务器中. 在代码中完成校验值对比逻辑,此部分代码后续不能再改变,否则CRC值会发生变化: 从生成 ...

  7. Git常用命名

    文字整理: git config - - 可以配置git的参数,可以使用 git config --list查看已经配置的git参数. 其中有三个级别的保存位置, –system(本系统) –glob ...

  8. mysql最权威的总结

    1.数据库操作 create database person charset utf8; -- 创建数据库show DATABASES; -- 查看数据库drop database person; - ...

  9. 精通模块化JavaScript

    近日读了一本名为<精通模块化JavaScript>的书,并记录了其中的精髓. 一.模块化思维 精通模块化开发并不是指要遵循一套定义明确的规则,而是指能够将自己置身于使用者的角度,为可能即将 ...

  10. C# 8 中的异步迭代器 IAsyncEnumerable<T> 解析

    异步编程已经流行很多年了,.NET 引入的 async 和 await 关键词让异步编程更具有可读性,但有一个遗憾,在 C# 8 之前都不能使用异步的方式处理数据流,直到 C# 8 引入的 IAsyn ...