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

AC 自动机

时间:2023-01-31 11:33:12浏览次数:49  
标签:tat AC 155 int iid 自动机

AC 自动机

AC 自动机是 以 Trie 的结构为基础,结合 KMP 的思想 建立的。

简要步骤

  1. 将所有的模式串构成一棵 Trie。
  2. 对 Trie 树上所有的结点构造失配指针。

然后就可以利用它进行多模式匹配了。

AC·code
#include<bits/stdc++.h>
#define I inline int
#define V inline void
#define ri register int

using namespace std;

const int N=1e6+5;
char x_x[155][75],c[N];
struct qwq{
	int fail,cnt;
	int nxt[26];
}tr[N];
int id;
V build(int tat){
	cin>>x_x[tat];
	int len=strlen(x_x[tat]);
	int t=0;
	for(int i=0;i<len;i++){
		if(!tr[t].nxt[abs(x_x[tat][i]-'a')%26]){
			tr[t].nxt[abs(x_x[tat][i]-'a')%26]=++id;			
		}
		t=tr[t].nxt[abs(x_x[tat][i]-'a')%26];
	}
	tr[t].cnt=tat;
	return;
}
V getfail(){
	queue<int> q;
	int t=0;
	for(int i=0;i<26;i++){
		if(tr[t].nxt[i]){
			q.push(tr[t].nxt[i]);
		}
	}
	while(!q.empty()){
		t=q.front();q.pop();
		for(int i=0;i<26;i++){
			if(tr[t].nxt[i]){
				tr[tr[t].nxt[i]].fail=tr[tr[t].fail].nxt[i];
				q.push(tr[t].nxt[i]);
			}
			else{
				tr[t].nxt[i]=tr[tr[t].fail].nxt[i];
			}
		}
	}
	return;
}
V find(int n){
	cin>>c;
	int ans[155]={0};
	int len=strlen(c);
	int s=1,t=0;
	int iid[155]={0},tii=0;
	iid[0]=1;
	for(int i=0;i<len;i++){
		t=tr[t].nxt[abs(c[i]-'a')%26];
		for(int j=t;j;j=tr[j].fail){
			ans[tr[j].cnt]++;
		}
	}
	for(int i=2;i<=n;i++){
		if(ans[i]>ans[s]){
			s=i,tii=0,iid[0]=s;
		}
		else if(ans[i]==ans[s]){
			iid[++tii]=i;
		}
	}
	cout<<ans[s]<<"\n";
	for(int i=0;i<=tii;i++){
		cout<<x_x[iid[i]]<<"\n";
	}
	return;
}

int n;

V memsett(){
	for(int i=0;i<=n;i++){
		memset(tr[i].nxt,0,sizeof(tr[i].nxt));
		tr[i].fail=tr[i].cnt=0;
	}	
	return;
}
int main(){
	cin>>n;
	while(n){
		memsett();
		for(int i=1;i<=n;i++) build(i);
		getfail();
		find(n);	
		cin>>n;	
	}
	return 0;
}

标签:tat,AC,155,int,iid,自动机
From: https://www.cnblogs.com/windymoon/p/17078444.html

相关文章

  • Autofac中的AsImplementedInterfaces()
    在项目开发中,遇到一个问题,是这样的,我们有一个接口IConfigurationpublicinterfaceIConfiguration{stringDefaultValue{get;}intOrde......
  • Oracle存储过程打印输出错误信息、行号,快速排查
    本文转载自https://blog.csdn.net/lw112190/article/details/128268465 感谢博主 天天代码码天天 热心分享测试存储过程如下:createorreplaceprocedureprc_testi......
  • win10中Oracle完全卸载
    1、停止所有服务win+R输入services.msc打开服务,停止所有Oracle服务。2、卸载Oracle3、清理注册表1)运行regedit,选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,按del键删......
  • Windows10中macOS10.14虚拟机性能优化教程
    ​​Python全栈工程师核心面试300问深入解析(2020版)----全文预览​​Windows10中采用VMware15安装安装macOS10.14教程虚拟机中masOS运行并不是完美流畅,需要进行性能......
  • oracle 多行转一行逗号分割
    查询结构是多号,想将memo逗号分割后放到一行,修改如图     ......
  • react官方文档-高级部分-性能优化学习
    前言:UI更新需要昂贵的DOM操作,而React内部使用几种巧妙的技术以便最小化DOM操作次数。对于大部分应用而言,使用React时无需专门优化就已拥有高性能的用户界面。尽管......
  • 【macOS】VMware Fusion安装Windows11虚拟机(支持Apple Silicon)
    ✨VMwareFusion官方网站:https://www.vmware.com/cn/products/fusion.htmlVMwareFusionPlayer:免费供个人使用VMwareFusionPro:提供使用许可证与商业许可证两者具体......
  • USACO2023 Bronze 题解
    Problem1.Leaders\(\mathcal{Farmer\John}\)共有\(n\)头奶牛,品种用字符\(\mathsf{G}\)或\(\mathsf{H}\)表示。每一头牛有一个管辖区间\([i,E_i]\)称一头......
  • 24种设计模式--工厂模式(Factory)创建型
    目录1.简单工厂模式simpleFactory概述接口类实现类简单工场类测试类测试结果:参考链接1.简单工厂模式simpleFactory概述工厂模式中,我们在创建对象时不会对客户端暴露创......
  • TypeDB Forces 2023 C. Remove the Bracket
    链接:https://codeforces.com/contest/1787/problem/C题意:给定数组a数n和s,再由\(x_i+y_i=a_i\)且\((x_i-s)\cdot(y_i-s)\geq0\)一个式子令其值最小$F=a_1\cdotx_......