AC自动机

ac自动机以及它上面的DFA          AC自动机(Aho-Corasick)主要用于多模式串的匹配问题,是前缀匹配搜索的一种方法,和KMP算法的思想类似。         总所周至,KMP算法中的关键next指针利用了模式串本身的性质,在失配时给出了重新匹配的位置。AC自动机中的fail指针也是一样,fail指针的构造关键是找到即是当点匹配串的后缀,又是trie中一个模式串的前缀的最长的字符串。         ... 阅读详情

HDU 3065

输入一个整数N,然后输入N个字符串。最后输入一行字符串。输出这N个字符串在最后一行字符串中出现的次数,如果没有在最后一行出现,则不输出。

 

Sample Input

 

3AABBCCooxxCC%dAAAoen....END

 

 

Sample Output

 

AA: 2CC: 1

 

 

 

#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;

#define N 2000100
#define maxnode 50010
#define sigma_size 26
struct node{
    char name[55];
    int num;
}S[1101];
struct Trie{
    int ch[maxnode][sigma_size];
    int val[maxnode];
    int f[maxnode];
    int sz;
    void init(){
        sz=1;
        memset(ch,0,sizeof(ch));
        memset(val,0,sizeof(val));
        memset(f,0,sizeof(f));
        val[0] = 0;
    }
    int idx(char c){
        return c-'A';
    }

    void Creat(char *s, int num){
        int u = 0, len = strlen(s);
        for(int i = 0; i < len; i++){
            int c = idx(s[i]);
            if(!ch[u][c]) ch[u][c] = sz++;
            u = ch[u][c];
        }
        val[u] = num ; //u若是单词结尾则为 +1
    }

    int find(char *T){
        int len = strlen(T);
        int j = 0;
        for(int i = 0; i < len; i++){
            if(T[i]<'A' || T[i]>'Z'){ j = 0; continue;}
            int c = idx(T[i]);
            j = ch[j][c];
            int temp = j;
            while(temp && val[temp]){
                S[ val[temp] ].num ++;
                temp = f[ temp ];
            }
        }

        return 0;
    }

    void getFail(){
        queue<int> q;
        //初始化队列
        for(int c = 0; c < sigma_size; c++)
            if(ch[0][c])q.push(ch[0][c]);

        while(!q.empty()){
            int r = q.front(); q.pop();
            for(int c = 0; c < sigma_size; c++){
                int u = ch[r][c];
                if(!u){ ch[r][c] = ch[f[r]][c]; continue; }
                q.push(u);
                int v = f[r];
                while(v && !ch[v][c]) v = f[v]; //沿失配边追溯到可以匹配的(非原点)位置
                f[u] = ch[v][c];
            }
        }
    }
};
Trie ac;
char S1[N];

int main(){
    int n;
    while(~scanf("%d",&n)){
        ac.init();
        for(int i = 1; i <= n; i++){
            scanf("%s",S[i].name);
            S[i].num = 0;
            ac.Creat(S[i].name, i);
        }
        ac.getFail();

        scanf("%s",S1);
        ac.find(S1);

        for(int i = 1; i <= n; i++)
            if(S[i].num)
                printf("%s: %d\n",S[i].name, S[i].num);

    }
    return 0;
}

 

 

 

从时频谱图到智能感知:雷达信号处理的AI进化之路 本文探讨了人工智能在雷达信号处理中的革命性应用,特别是深度学习在时频谱图分析中的突破性进展。通过对比传统信号处理方法与AI驱动的解决方案,展示了CNN、3D CNN等模型在目标检测、行为识别等场景中的优势,并分析了数据获取、模型优化等关键技术挑战。AI赋能的雷达技术已广泛应用于智能交通、工业检测和医疗健康领域,展现出巨大的发展潜力。 阅读详情

相关推荐

TBtools的序列提取步骤

本教程详细介绍了如何使用TBtools软件从原来的FASTA序列中提取特定的DNA序列。

weixin_47509995的博客 1万+

AC自动机-详解AC自动机以及模板

AC自动机-详解AC自动机以及模板AC自动机算法简介AC自动机算法大致流程AC自动机详细图解AC自动机模板题与模板题目内容代码详解完整代码 AC自动机算法简介 首先简要介绍一下AC自动机,英文名:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模板匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。 要搞懂AC自动机,先要有字典树Trie和KMP模式匹配算法的基础知识。其中,KMP是用于一对一的字符串匹

qq_43381135的博客 6858

6层高速PCB设计实战:BGA布局与阻抗匹配关键解析

本文深入解析6层高速PCB设计中BGA布局与阻抗匹配的关键技术。通过实战经验分享,详细介绍了六层PCB层叠结构的选择与优化、BGA器件布局技巧、阻抗匹配的实战经验以及高速布线技巧,帮助工程师提升PCB设计水平,确保信号完整性和电源完整性。

weixin_28481133的博客 368

AC自动机(详解)

需要提前了解的知识:KMP, 字典树 例题:传送门 AC自动机是KMP和字典树的结合体, 如果说KMP用于单模式匹配,那么AC自动机是用于多模式匹配的。 举个例子,KMP适用于在一篇文章中找一句话, AC自动机适合在一篇文章中寻找多句话(并不是简单的多用几次KMP)。 KMP算法构建了一个查询表(nex数组), 我们可以按照相同的思路构建nex表,在ac自动机中成为失配数组。 算法思路: 先将所有的模式串建立字典树, 建立nex数组,然后就开始匹配。 ...

三季人的博客 1万+

GaN功率放大器设计避坑指南:从仿真到实测的Doherty PA完整流程(基于ADS 2023)

本文详细介绍了基于ADS 2023软件,从理论计算、电路仿真到版图后仿真的GaN Doherty功率放大器完整设计流程。文章聚焦C波段应用,深入剖析了负载调制网络设计、稳定性处理、版图电磁仿真等关键环节中的常见误区与工程折衷,为工程师提供了一套从设计到实测的实战避坑指南。

weixin_29238147的博客 530

Abaqus梁模型仿真中的常见陷阱与优化策略

本文深入探讨了Abaqus梁模型仿真中的常见陷阱与优化策略,涵盖几何建模、材料属性设置、边界条件处理等关键环节。针对梁截面方向定义、网格划分、复合截面建模等典型问题,提供了实用的Python脚本示例和优化方案,帮助工程师避免计算错误并提升仿真精度。文章特别强调了动力分析中的网格密度要求和材料非线性考虑,为复杂工程应用提供专业指导。

weixin_29099217的博客 461

字符串处理【AC自动机】 - 原理 AC自动机详解

字符串处理【AC自动机】 - 原理 AC自动机详解

代码改变世界 3589

PotPlayer终极画质调校:深入MadVR渲染器设置,让你的显示器发挥100%潜力

本文深入探讨了如何通过MadVR渲染器优化PotPlayer的画质设置,充分发挥高端显卡和显示器的潜力。从色彩空间匹配、色深优化到HDR元数据处理,提供了一套完整的配置指南,帮助用户实现影院级视觉体验。特别适合拥有NVIDIA RTX或AMD RX系列显卡的用户进行精细调校。

weixin_42530458的博客 600

AC自动机详细讲解

AC自动机详细讲解

温姑娘的博客 2699

深入解析Incapsula reese84的生成机制与绕过策略

本文深入解析了Incapsula reese84的生成机制与绕过策略。reese84是一种基于客户端JavaScript挑战的Web安全防护,通过动态算法收集浏览器指纹并生成令牌Cookie。文章详细拆解了其两步验证流程,并提供了使用无头浏览器、逆向JS模拟请求以及Token维护等实战绕过方法,帮助开发者和安全研究人员应对自动化访问拦截。

weixin_29256771的博客 443

MATLAB库函数unwrap(相位解卷绕)的C语言实现

什么是相位解卷绕 Q = unwrap(P) Q = unwrap(P) corrects the radian phase angles in a vector P by adding multiples of ±2π when absolute jumps between consecutive elements of P are greater than or equal to the default jump tolerance of π radians. If P is a matrix, unw

业精于勤,荒于嬉 4247

AC自动机算法

AC自动机简介:  首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有字典树Trie和KMP模式匹配算法的基础知识。KMP算法是单模式串的字符匹配算法,AC自动机是多模式串的字符匹配算法。

飘过的小牛 9万+

【Bug已解决】This model‘s maximum context length is X tokens. However, you requested Y tokens 解决方案

summary_prompt = "请将以下对话历史压缩成一段简洁摘要,保留关键决策和结论:\n" + format_messages(old_part)return [{"role": "system", "content": f"此前对话摘要:{summary}"}] + recent_part这种方式能在大幅降低 token 消耗的同时,尽量保留任务推进所需的关键上下文,是目前业内做长会话 Agent 最常见的处理方式之一。方案适用场景推荐指数滑动窗口裁剪短任务,对早期历史依赖不强⭐⭐⭐。

一键难忘的博客 1万+

AC自动机总结

如果你还不知道KMP是什么,或者不知道Trie是什么,先点下面的链接,学好这两样再来看这篇文章。 KMP入门教程传送门。 Trie入门教程传送门。 好,那么我来讲讲AC自动机吧。 以洛谷P3808模板题为例, 如果我们有n个模式串,和一个文本串,我们需要统计有多少个模式串在文本串中出现了,怎么办? 显然,如果我们直接枚举每个模式串,然后将其与文本串进行匹配,判断是否匹配成功,那么效率就

Holylight_Knight 1641

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

AC自动机步骤详解

AC自动机 算法意义: 求多个字符串是否在主串中出现过。可依据情况分别求出出现次数,出现位置等。 学习基础: 要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。 AC自动机的构造: 1.构造一棵Trie,作为AC自动机的搜索数据结构。 2.构造fail指针,使当前字符失配时跳转到具有最长公共前后缀的字符继续匹配。如同 KMP算法一样, AC自

问鼎63的博客 2511

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

AC 自动机

AC 自动机 引入 AC 自动机是一种用于解决多模式串以及一主串匹配的字符串算法。 问题通常是给出若干个模式串 S 以及主串 T,询问若干个模式串分别在主串中的某些信息。 AC 自动机构建在 Trie 的结构基础上,结合了 KMP 算法的失配指针思想。 在进行多模式串匹配前,只有两个步骤需要去实现: 将所有模式串扔进一棵 Trie 树中。 对于 Trie 上的所有节点构建失配指针。 AC 自动机的时间复杂度约为 O(n+m)O(n+m)O(n+m)。 算法思想 AC 自动机其实就是在 Trie

orz 1823
上一篇: 字典树
下一篇: Dijkstra最短路算法和Floyd最短路算法
flyzer
博客等级 码龄9年 27粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值