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

AC 自动机

时间:2024-03-01 22:33:25浏览次数:22  
标签:AC end int pos fail 自动机 root

AC自动机

基于字典树Trie,用于多单词匹配问题

struct Trie{
	int to[30];//edge
	int fail,end;//end-cnt(same word with dif id)
}AC[N];
#define root 0
int cnt=0;//point cnt 
inline void build(string s){
	int sz=s.size();
	int pos=root;
	rep0(i,sz){
		if(AC[pos].to[s[i]-'a'])//has edge,move
			pos=AC[pos].to[s[i]-'a'];
		else{//no edge,build new
			AC[pos].to[s[i]-'a']=++cnt;
			pos=cnt;
		}
	}
	AC[pos].end+=1;
}

queue<int> q;

inline void get_fail(){
	rep0(i,26){
		if(AC[root].to[i]){
			AC[AC[root].to[i]].fail=root;
			q.push(AC[root].to[i]);
		}
	}
	while(!q.empty()){//bfs
		int u=q.front();q.pop();
		rep0(i,26){
			if(AC[u].to[i]){
				AC[AC[u].to[i]].fail=AC[AC[u].fail].to[i];//u-->v
				q.push(AC[u].to[i]);
			}
			else AC[u].to[i]=AC[AC[u].fail].to[i];//use for dp
		}
	}
}

inline int match(string s){
	int sz=s.size();
	int pos=root,ans=0;
	rep0(i,sz){
		pos=AC[pos].to[s[i]-'a'];
		for(int j=pos;j&&(AC[j].end!=-1);j=AC[j].fail){//find suf
			ans+=AC[j].end;
			AC[j].end=-1;
		}
	}
	return ans;
}

标签:AC,end,int,pos,fail,自动机,root
From: https://www.cnblogs.com/Cindy-Li/p/18048105

相关文章

  • Redis Docekr WARNING Memory overcommit must be enabled! Without it, a background
    Docker容器ssr-redis|1:C01Mar202422:00:46.869#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oossr-redis|1:C01Mar202422:00:46.869#Redisversion=7.0.10,bits=64,commit=00000000,modified=0,pid=1,juststartedssr-redis|1:C01Mar......
  • DP Pack
    之前没想着要放上来的,但是为了方便查看还是放上来吧。现在时间是省选Day0。P7154需要按照大小匹配的问题不妨转化成括号序列。对于所有的奶牛和牛棚排序,位置相同奶牛在前。把所有牛棚看作是右括号,奶牛看作左括号,然后进行括号匹配。最后对于所有“失配”的括号必须满足失配的......
  • EndNote 21:文献整理与引用,一键轻松搞定 mac/win版
    EndNote21是一款功能强大的文献管理软件,专为学术研究者、学生和教师设计。它提供了全面的文献管理解决方案,帮助用户轻松整理、引用和分享学术文献。→→↓↓载EndNote21mac/win版EndNote21拥有直观的用户界面和强大的文献检索功能,用户可以轻松地从各种数据库和在线资源中导......
  • Eclipse如何让项目中package呈树状显示
    1.问题项目中package呈flat平铺排序,不能显示出相应层级,妨碍我们阅读项目,如何规定其按树状显示?2.解决2.1选择如图所示按键2.2找到PackagePresentation,并选择Hierarchical即树状显示即可......
  • Mac Numbers 记账
    最近在摆弄用Mac自带的Numbers表格软件记账。2月份一直用的Numbers自带的PersonalBudget模板记,但深感自由度不高,而且其给的分类也不太能对应上我的日常花销,遂仿照其自己重新做了一个记账本。在此记录一些使用Numbers时遇到的一些小问题和解决方案。单元格数据类型Nu......
  • 关于pacemaker-集群-token-网络心跳检测时间的修改
    在笔者操作系统Redhat8.8中,pacemaker默认的token时间为3000毫秒,也可以理解成心跳检测时间这样根据默认的规则,consensus有时间如果没有特别指定的话,将是token*1.2,即3600毫秒[root@azdb01qq-5201351]#corosync-cmapctl|grep'totem.token\|consensus'runtime.config.tote......
  • 核心子方法5: invokeBeanFactoryPostProcessors(beanFactory)方法详解
    先总结: 该方法通过指定顺序,遍历调用各种实现了BeanDefinitionRegistryPostProcessor接口或BeanFactoryPostProcessor接口,的beanFactory后处理器注: BeanDefinitionRegistryPostProcessor接口继承了BeanFactoryPostProcessor接口调用顺序: 1.先调用已经提前放入Applicat......
  • [转]acme自动化---免费SSL证书申请并自动续期
    原文地址:acme自动化---免费SSL证书申请并自动续期_createnewordererror.le_orderfinalizenotfound-CSDN博客背景:各CA厂家都在缩短免费证书的有效时间,包括现在与阿里合作的,普遍只有90天,这样如果频繁手动申请更换就很繁琐,正好github上有一个star数很高的工具acme.sh,......
  • av_packet_rescale_ts
    /***Convertvalidtimingfields(timestamps/durations)inapacketfromone*timebasetoanother.Timestampswithunknownvalues(AV_NOPTS_VALUE)willbe*ignored.**@parampktpacketonwhichtheconversionwillbeperformed*@paramsrc_tb......
  • faster-fifo:C++实现的python多进程通信队列 —— 强化学习ppo算法库sample-factory的C
    项目地址:https://github.com/alex-petrenko/faster-fifo需要注意,该项目给出了两种安装方法,一种是pip从pypi官网安装,一种是从GitHub上的源码安装;经过测试发现这个项目维护程度较差,因此pypi官网上的项目比较落后,因此不建议使用pypi上的安装,而是进行源码编译安装。给出源码编......