自动AC机qwq(大雾)以及trie图fail图的一些结论
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图的一些结论的更多相关文章
- Censoring【自动AC机】【水题毁我青春】【20190614】
这题简直比注水猪肉还水QAQ. 以前做过KMP的Censoring单串匹配,果断选择自动AC机w 对短串建自动AC机 长串去机子里匹配 用个栈边匹配边弹出 记得弹出一个串后把匹配点指向栈顶就ojbk ...
- 关于自动AC机
嗯,,,,自动AC机 在cena评测时: Const SourcePath:string='incantation'; InputFile:string='incantation.in'; Outpu ...
- 论自动AC机
O(∩_∩)O哈哈~第一篇原创博客.终于结束了我“无敌转载王”的称号了!!!好开心! (⊙v⊙)嗯,看到标题觉得我是神犇的人,请再次仔细看看标题,是“自动AC”,而非“AC自动”哦!这是利用lemon ...
- 自动AC机
可以在lemon和cena环境下使用. #include<iostream> #include<cstdio> #include<cstring> #include ...
- 继续node爬虫 — 百行代码自制自动AC机器人日解千题攻占HDOJ
前言 不说话,先猛戳 Ranklist 看我排名. 这是用 node 自动刷题大概半天的 "战绩",本文就来为大家简单讲解下如何用 node 做一个 "自动AC机&quo ...
- 三极管的妙用之C118自动刷机
首先咱们要搞清楚咱们自动刷机的原理,不谈修改固件那么高深的东西,简单的就是控制开机键. 使用继电器来控制基本上算是上个世纪的想法吧,之前博主也做过,做出来的感觉其实也很不错,就像是一个收藏品.因为继电 ...
- BZOJ 1704: [Usaco2007 Mar]Face The Right Way 自动转身机( 贪心 )
贪心...先枚举k, 然后从左往右扫一遍, 发现位置p的牛的状态不符合就将 [p, p + k ) 的牛都转身, 假如p + k - 1 已经超过了最右边牛的位置那这个k就不符合要求. 符合要求的就可 ...
- 【bzoj1704】[Usaco2007 Mar]Face The Right Way 自动转身机 贪心
题目描述 农夫约翰有N(1≤N≤5000)只牛站成一排,有一些很乖的牛朝前站着.但是有些不乖的牛却朝后站着.农夫约翰需要让所有的牛都朝前站着.幸运的是约翰最近买了一个自动转身机.这个神奇的机器能使K( ...
- [bzoj1704][Usaco2007 Mar]Face The Right Way 自动转身机_贪心
Face The Right Way 自动转身机 bzoj-1704 Usaco-2007 Mar 题目大意:不想描述题意系列++... ...题目链接 注释:略. 想法:我们直接枚举k,然后从左往右 ...
随机推荐
- QT实现输入框与下拉框提示并可模糊匹配
功能:支持下拉框选择.手动输入更改和模糊匹配 组件:QLineEdit.QComboBox.QCompleter.QStringListModel 一.组件介绍 1.1 QLineEdit QLine ...
- nacos服务注册之服务器端Raft
Raft是持久化,数据存储在\nacos\data\naming\data目录 nacos启动后首先从数据存储目录加载数据 Raft协议中节点只有一个LEADER,只有LEADER节点负责数据写入,F ...
- 华硕主板开机无法进入BIOS
先说下本人情况,自己组装的台式机,华硕TUF B550M-Plus (wifi)的主板,CPU是锐龙 4650G(带核显),其他配件不涉及问题就不提了. 原来用独显的时候,没啥问题,开机有品牌logo ...
- 关于使用C3P0程序报错Having failed to acquire a resource, com.mchange.v2.resourcepool的问题
由于是新手的问题,C3P0的使用时严格跟着视频来的,但是问题却来的很突然 在导入了三个包以及创建了路径以后 进行测试 class JdbcutilsTest { @Test void TestGetC ...
- python:虚拟环境与pip
原生pip镜像下载速度较慢,配置使用国内镜像.这里选择清华镜像,文档地址:https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ pip 镜像配置 临时使用: ...
- Hi3559AV100外接UVC/MJPEG相机实时采图设计(二):V4L2接口的实现(以YUV422为例)
下面将给出Hi3559AV100外接UVC/MJPEG相机实时采图设计的整体流程,主要实现是通过V4L2接口将UVC/MJPEG相机采集的数据送入至MPP平台,经过VDEC.VPSS.VO最后通过HD ...
- 剑指 Offer 55 - II. 平衡二叉树 + 平衡二叉树(AVL)的判断
剑指 Offer 55 - II. 平衡二叉树 Offer_55_2 题目描述 方法一:使用后序遍历+边遍历边判断 package com.walegarrett.offer; /** * @Auth ...
- 测试工程师Docker进阶
学习整理来源 B站 狂神说Java https://space.bilibili.com/95256449/ 四.docker镜像 1.镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运 ...
- 我与FreeBSD的故事之一
记得还是那些无聊的日子,群里有网友称Linux只能玩WPS,我表示质疑,并通过百度这个搜索引擎搜索到了Ubuntu Kylin,即由湖南的国防科技大学与Ubuntu社区合作并由其主导的Ubuntu麒麟 ...
- PTE 准备之 Read aloud
Read aloud A text appears on screen.Read the text aloud rext up tp 60 words varies by task, dependin ...