首页 > 其他分享 >AC自动机模板

AC自动机模板

时间:2023-09-08 23:12:09浏览次数:36  
标签:tmp AC now end int son Fail 自动机 模板

Smiling & Weeping

              ---- 自从我们相遇的那一刻,你是我白天黑夜不落的星

 

题目链接:Problem - 2222 (hdu.edu.cn)

题目就是一道AC自动机模板

Talk is cheap , show me the code

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cstdio>
 6 #include<queue>
 7 using namespace std;
 8 const int N = 1000005;
 9 struct node{
10     int son[26];                // 26个字母
11     int end;                    // 字符串结尾标记
12     int fail;                   // 失配指针
13 }t[N];                          // trie,字典树
14 int cnt;                        // 当前新分配的存储位置
15 void Insert(char *s){           // 在字典树上插入单词s
16     int now = 0;                // 字典树上当前匹配到的节点,从root=0开始
17     for(int i = 0; s[i]; i++){  // 逐一在字典树上查找s[]的每个字符
18         int ch = s[i]-'a';      
19         if(t[now].son[ch] == 0) // 如果这个字符还没有存过
20             t[now].son[ch] = cnt++; // 把cnt位置分配给这个字符
21         now = t[now].son[ch];       // 沿着字典树向下走
22     }
23     t[now].end++;               // end>0,它是字符串的结尾,end=0不是结尾
24 }
25 void getFail(){                 // 用BFS构建每个节点的Fail指针
26     queue<int> q;               
27     for(int i = 0; i < 26; i++) // 把第1层入队,即root的子节点
28         if(t[0].son[i])         // 这个位置有字符
29             q.push(t[0].son[i]);
30     while(!q.empty()){
31         int now = q.front();    // 队首的Fail指针已求得,下面求它孩子的的Fail指针
32         q.pop();
33         for(int i = 0; i < 26; i++){    // 遍历now的所有孩子
34             if(t[now].son[i]){          // 若这个位置有字符
35                 t[t[now].son[i]].fail = t[t[now].fail].son[i];
36                 // 这个孩子的Fail="父节点的Fail指针所指向的节点的与x同字符的子节点"
37                 q.push(t[now].son[i]);  // 这个孩子先入队,后面再处理它的孩子
38             } else {                    // 若这个位置无字符
39                 t[now].son[i] = t[t[now].fail].son[i];  // 虚拟节点,用于底层的Fail指针计算
40             }
41         }
42     }
43 }
44 int query(char *s){                     // 在文本s中找有多少个模式串
45     int ans = 0;
46     int now = 0;                        // 从 root=0 开始找
47     for(int i = 0; s[i]; i++){          // 对文本串进行遍历
48         int ch = s[i] - 'a';
49         now = t[now].son[ch];
50         int tmp = now;
51         while(tmp && t[tmp].end != -1)  // 利用Fail指针找出所有匹配的模式串
52         {
53             ans += t[tmp].end;
54             t[tmp].end = -1;            // 以这个字符为结尾的模式串已经统计,后面不需要再统计
55             tmp = t[tmp].fail;          // fail指针跳转
56             // cout << "tmp=" << t[tmp].son;
57         }
58     }
59     return ans;
60 }
61 char str[N];
62 int main()
63 {
64     int k;
65     scanf("%d",&k);
66     while(k--){
67         memset(t , 0 , sizeof(t));
68         cnt = 1;
69         int n;
70         scanf("%d",&n);
71         while(n--) { scanf("%s",str); Insert(str); }
72         getFail();
73         scanf("%s",str);
74         printf("%d\n",query(str));
75     }
76     return 0;
77 }

当上天赐给你荒野时,就意味着,他要你成为高飞的鹰

文章到此结束,外面下次再见

标签:tmp,AC,now,end,int,son,Fail,自动机,模板
From: https://www.cnblogs.com/smiling-weeping-zhr/p/17688726.html

相关文章

  • 重磅!python自动化办公,终于支持 Mac下载了
    大家好,这里是程序员晚枫,小红薯/小破站也叫这个名。给小白的《50讲Python自动化办公》,课程一直在更新中,昨晚12点多,有朋友在课程群里问能不能支持Mac?今天给大家分享一个好消息:python-office终于支持mac下载了。下载命令先给大家说一下下载命令,然后再说注意事项。不论你的电脑上......
  • 67.Oracle之内核参数
    net.ipv4.tcp_rmem=4096873804194304net.ipv4.tcp_wmem=4096163844194304fs.aio-max-nr=1048576fs.file-max=6815744kernel.shmall=2097152kernel.shmmax=4294967295kernel.shmmni=4096kernel.sem=25032000100128net.ipv4.ip_local_port_range......
  • John:No password hashes left to crack (see FAQ)
    使用john--wordlist=/usr/share/wordlists/rockyou.txt文件名出现:Usingdefaultinputencoding:UTF-8Loaded1passwordhash(netntlmv2,NTLMv2C/R[MD4HMAC-MD532/64])Nopasswordhasheslefttocrack(seeFAQ)说明该文件已经被破解过,结果存放在john.pot中......
  • Midjourney充值失败完美解决方案及共享会员:Error: subscription already active for u
    Midjourney账号充值遇到避坑指南:今天给Midjourney账号充值遇到如下错误:Error:subscriptionalreadyactiveforuser:09e6aa4a-f7a8-4451-ae2c-9a9e5c2c522a问题是之前充值后把连续续费取消了,但是现在过期了,打算重新续费,结果就这样了。解决方案:1.Midjourney会在续费失败时......
  • 【题解】CF1830A Copil Copac Draws Trees
    你考虑对于每一条边打上时间标记,然后在树上DFS的时候维护一下以\(u\)为根的答案即可,然后将答案合并,反正很简单,看代码就懂。code:#include<bits/stdc++.h>usingnamespacestd;constintNN=2e5+8;intt,n;structEdge{ intto,next,val;}edge[NN<<1];inthead[......
  • JAVA日志技术 & Logback
    前言为什么需要记录日志?我们不可能实时的24小时对系统进行人工监控,那么如果程序出现异常错误时要如何排查呢?并且系统在运行时做了哪些事情我们又从何得知呢?这个时候日志这个概念就出现了,日志的出现对系统监控和异常分析起着至关重要的作用一、日志概括1.了解日志框架JAVA在早期的日......
  • Oracle数据库添加索引注意事项
    1、确定是否有专门的索引空间。--查看表所在的表空间SELECT*FROMuser_tablestWHEREt.table_name='TABLENAME';--查看索引所在的索引空间SELECTTABLESPACE_NAMEFROMDBA_INDEXESWHEREINDEX_NAME='INDEXNAME';2、预估建立索引所需的空间大小。3、查看表空间剩余或者索......
  • AI之gpt_academic
    为ChatGPT/GLM提供实用化交互界面,特别优化论文阅读/润色/写作体验,模块化设计,支持自定义快捷按钮&函数插件,支持Python和C++等项目剖析&自译解功能,PDF/LaTex论文翻译&总结功能,支持并行问询多种LLM模型,支持chatglm2等本地模型。兼容文心一言,moss,llama2,rwkv,claude2,通义千问......
  • live555作为RTSP流媒体服务器时Server端多track而客户端仅请求一个track,当客户端关闭
    当我们使用live555作为流媒体服务器时,某个通道对应的所有客户端断开后,不能正常回调关闭。某一通道同时支持视频和音频输出,即video和audio两个trackVLC和EasyPlayer播放库来中的RTSPClient则都会请求(所以不存在问题);而某些客户端则只请求了一个track,比如video;此时再关闭......
  • Machine learning note(1)
    注:本笔记不给出完整解释正规方程设\(z=\theta^{T}x\)设损失函数为\(J(\theta)\),求令\(\frac{\partialJ}{\partial\theta}=0\)的\(\theta\)由此得出最优的\(\theta\)牛顿迭代回顾一下梯度下降:\(\theta'=\theta-\alpha*\frac{\partialJ}{\partial\theta}\)另一种方法是牛......