bzoj 3172 AC自动机

本文详细介绍AC自动机的构建原理及实现方法,通过实例演示如何基于Trie树构建AC自动机,包括fail指针的设置与优化,以及如何利用AC自动机解决字符串匹配问题。

      初学AC自动机,要先对于每一个模式串求出来trie树,在此基础上构建fail指针,然后在trie树加上失配边构建出整张trie图。

      AC自动机的原理和KMP差不多,一个节点的fail指针就是指向trie树上一个最长前缀等于这个单词的后缀。

      首先fail[0]=0,然后把0有的每个孩子push进一个队列里(如果直接push(0)的话会出现f[x]=x),然后bfs。

      设一个节点为u,父亲为v,那么如果ch[fail[v]][u是v的哪个孩子]!=0,那么fail[u]就等于它,否则就不停的跳fail直到0或存在这个孩子。

      但我们可以用trie图来优化这个过程,每个节点的每个孩子都不为空,如果原本为空就直接指向上一步用while循环求的那个孩子(具体看代码),于是跳的时候无脑跳一步就行了。

      考虑这道题,一个单词一定为trie上的一个节点,而且它出现在文章中一定是一个前缀的后缀,所以那些fail指针直接或间接指向它的节点一定包含这个前缀,所以用bfs序倒着dp一遍就行了。

   

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #define N 1000005
 7 using namespace std;
 8 int n;
 9 char s[N];
10 int cnt;
11 int ch[N][26],f[N],ans[N],sum[N];
12 int b[N];
13 void in(int xx)
14 {
15     int now=0,l=strlen(s);
16     for(int i=0;i<l;i++)
17     {
18         int x=s[i]-'a';
19         if(!ch[now][x])ch[now][x]=++cnt;
20         now=ch[now][x];sum[now]++;
21     }
22     b[xx]=now;
23 }
24 queue<int>q;int a[N];int tot;
25 void fail()
26 {
27     f[0]=0;
28     for(int i=0;i<26;i++)
29     {
30         int u=ch[0][i];
31         if(u)q.push(u),a[++tot]=u;
32     }
33     while(!q.empty())
34     {
35         int tmp=q.front();q.pop();a[++tot]=tmp;
36         for(int i=0;i<26;i++)
37         {
38             int u=ch[tmp][i];
39             if(!u)
40             {
41                 ch[tmp][i]=ch[f[tmp]][i];continue;
42             }
43             q.push(u);f[u]=ch[f[tmp]][i];
44         }
45     }
46 }
47 int main()
48 {
49     scanf("%d",&n);
50     for(int i=1;i<=n;i++)
51     {
52         scanf("%s",s);
53         in(i);
54     }
55     fail();
56     for(int i=tot;i>=1;i--)sum[f[a[i]]]+=sum[a[i]];
57     for(int i=1;i<=n;i++)
58     {
59         printf("%d\n",sum[b[i]]);
60      } 
61     return 0;
62 }

 

转载于:https://www.cnblogs.com/ezyzy/p/6148273.html

标题基于SpringBoot的马术俱乐部管理系统设计与实现AI更换标题第1章引言介绍马术俱乐部管理系统的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义阐述马术俱乐部管理系统对提升俱乐部管理效率的重要性。1.2国内外研究现状分析国内外马术俱乐部管理系统的发展现状及存在的问题。1.3研究方法以及创新点概述本文采用的研究方法,包括SpringBoot框架的应用,以及系统的创新点。第2章相关理论总结和评述与马术俱乐部管理系统相关的现有理论。2.1SpringBoot框架理论介绍SpringBoot框架的基本原理、特点及其在Web开发中的应用。2.2数据库设计理论阐述数据库设计的基本原则、方法以及在管理系统中的应用。2.3马术俱乐部管理理论概述马术俱乐部管理的基本理论,包括会员管理、课程安排等。第3章系统设计详细描述马术俱乐部管理系统的设计方案,包括架构设计、功能模块设计等。3.1系统架构设计给出系统的整体架构,包括前端、后端和数据库的交互方式。3.2功能模块设计详细介绍系统的各个功能模块,如会员管理、课程管理、预约管理等。3.3数据库设计阐述数据库的设计方案,包括表结构、字段设计以及数据关系。第4章系统实现介绍马术俱乐部管理系统的实现过程,包括开发环境、编码实现等。4.1开发环境搭建介绍系统开发所需的环境,包括操作系统、开发工具等。4.2编码实现详细介绍系统各个功能模块的编码实现过程。4.3系统测试与调试阐述系统的测试方法、测试用例以及调试过程。第5章系统应用与分析呈现马术俱乐部管理系统的应用效果,并进行性能分析。5.1系统应用情况介绍系统在马术俱乐部中的实际应用情况。5.2系统性能分析从响应时间、并发处理能力等方面对系统性能进行分析。5.3用户反馈与改进收集用户反馈,提出系统改进建议。第6章结论与展望总结马术俱乐部管理系统的设计与实现成果,并展望未来的研究
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值