AC自动机(AC automation)

本文介绍了一种结合字典树与KMP算法的方法,用于高效地在文本中查找多个模式串。通过构建AC自动机,实现了快速匹配,并详细展示了插入节点、构建失配指针及匹配过程的具体实现。

  字典树+KMP

  参考自: http://www.cppblog.com/mythit/archive/2009/04/21/80633.html

  

 1 const int MAXN = 26; //字典大小
 2 
 3 //定义结点
 4 struct node{
 5     node* fail;
 6     node* child[MAXN];
 7     int count;
 8     node(){
 9         fail = NULL;
10         count = 0;
11         memset(child, NULL, sizeof(child));
12     }
13 };
14 
15 //将词插入字典树
16 void insert(node* root, char* str){
17     node* p = root;
18     int i = 0;
19     while(str[i]){
20         int index = str[i] - 'a';
21         if(p->child[index] == NULL) p->child[index] = new node();
22         p = p->child[index];
23         ++i;
24     }
25     p->count++;
26 }
27 
28 //BFS构造失配指针/构建ACautomation
29 //由当前结点构造子结点失配指针
30 void build_acautomation(node* root){
31     queue<node*> q;
32     root->fail = NULL;
33     q.push(root);
34     while(!q.empty()){
35         node* temp = q.front();
36         node* p = NULL;
37         for(int i = 0; i < MAXN; ++i){
38             if(temp->child[i] != NULL){
39                 if(temp == root) temp->child[i]->fail = root;
40                 else{
41                     p = temp->fail;
42                     while(p != NULL){
43                         if(p->child[i] != NULL){
44                             temp->child[i]->fail = p->child[i];
45                             break;
46                         }
47                         p = p->fail;
48                     }
49                     if(p == NULL) temp->child[i]->fail = root;
50                 }
51                 q.push(temp->child[i]);
52             }
53         }
54     }
55 }
56 
57 //ACautomation匹配
58 //计算当前进行匹配的字符串及其后缀子串的个数
59 //count因题而异
60 int query(node* root){
61     int i = 0, cnt = 0, index;
62     node* p = root;
63     while(str[i]){
64         index = str[i]-'a';
65         while(p->child[index] == NULL && p != root) p = p->fail;
66         p = p->child[index];
67         p = (p == NULL ? root : p);
68         node* temp = p;
69         while(temp != root && temp->count != -1){
70             cnt += temp->count;
71             temp->count = -1;
72             temp = temp->fail;
73         }
74         ++i;
75     }
76     return cnt;
77 }

 

  继续学习..........准备做题(VJ kuangbin AC自动机专题)

 

转载于:https://www.cnblogs.com/book-book/p/5357669.html

内容概要:本文详细介绍了一个基于MATLAB实现的SWT-SVM故障诊断分类预测项目,通过平稳小波变换(SWT)进行信号去噪与多尺度特征提取,结合支持向量机(SVM)实现机械设备故障的智能分类。项目涵盖从数据采集、预处理、SWT分解、特征提取与降维(如PCA)、模型训练与优化(含交叉验证、网格搜索、贝叶斯优化)、性能评估(混淆矩阵、ROC曲线、F1分数等)到结果可视化与GUI界面开发的完整流程。系统具备高可解释性、强鲁棒性和良好工程集成能力,适用于多行业设备健康监测,并提供完整的代码实现与部署方案。; 适合人群:具备一定MATLAB编程基础,熟悉信号处理与机器学习算法的高校研究生、科研人员及工业领域从事设备故障诊断、智能运维的工程师和技术人员。; 使用场景及目标:①应用于智能制造、风电、轨道交通、石化、航空航天等领域的设备故障早期检测与健康状态评估;②构建端到端的智能诊断pipeline,提升诊断准确率与自动化水平;③通过GUI交互界面实现数据导入、模型训练、实时预测与结果导出,服务于科研教学与工业实际部署。; 阅读建议:建议读者结合文中提供的完整MATLAB代码与GUI设计,逐步复现各模块功能,重点关注SWT参数选择、特征降维策略、SVM超参数优化及模型评估方法。在实践过程中调试信号处理流程与分类性能,深入理解算法原理与工程落地的关键环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值