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

【模板】AC 自动机

时间:2022-11-06 19:23:34浏览次数:79  
标签:10 AC ch int acam tot 自动机 模板

posted on 2022-06-11 11:17:10 | under 模板 | source

template<int N,int M=26,int D='a'> struct acam{
	int ch[N+10][M],cnt[N+10],tot,fail[N+10];
	int sum[N+10],inn[N+10];
	int newnode(){return ++tot,cnt[tot]=fail[tot]=0,memset(ch[tot],0,sizeof ch[tot]),tot;}
	acam():tot(-1){newnode();}
	int insert(char *s){
		int len=strlen(s+1),u=0;
		for(int i=1;i<=len;i++){
			int &v=ch[u][s[i]-D];
			v?u=v:u=v=newnode();
		}
		return cnt[u]++,u;
	}
	void build(){
		queue<int> q;
		for(int i=0;i<M;i++) if(ch[0][i]) q.push(ch[0][i]);
		while(!q.empty()){
			int u=q.front();q.pop();
			for(int i=0;i<M;i++){
				if(ch[u][i]) fail[ch[u][i]]=ch[fail[u]][i],q.push(ch[u][i]);
				else ch[u][i]=ch[fail[u]][i];
			}
		}
	}
//	int query(char *s){
//		memset(vis,0,sizeof vis);
//		int len=strlen(s+1),u=0,res=0;
//		for(int i=1;i<=len;i++){
//			u=ch[u][s[i]-D];
//			for(int v=u;v&&!vis[v];v=fail[v]){
//				res+=cnt[v],vis[v]=1;
//			}
//		}
//		return res;
//	}
	void query(char *s){
		memset(sum,0,sizeof sum);
		memset(inn,0,sizeof inn);
		queue<int> q;
		int len=strlen(s+1),u=0;
		for(int i=1;i<=len;i++) sum[u=ch[u][s[i]-D]]++;
		for(int u=1;u<=tot;u++) inn[fail[u]]++;
		for(int u=1;u<=tot;u++) if(!inn[u]) q.push(u);
		while(!q.empty()){
			int u=q.front();q.pop();
			int v=fail[u];
			sum[v]+=sum[u];
			if(!--inn[v]&&v) q.push(v);
		}
	}
};

标签:10,AC,ch,int,acam,tot,自动机,模板
From: https://www.cnblogs.com/caijianhong/p/16863425.html

相关文章

  • 【模板】01-trie
    postedon2022-01-1716:13:39|under模板|source#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;template<intN,intM=2,intM......
  • how to extract jar file in linux
    mikeli@dell-pc:~/code/algo_java/algs4_source_code$jarxfalgs4.jar  Usage:jar{ctxui}[vfmn0PMe][jar-file][manifest-file][entry-point][-Cdir]files......
  • webstorm里面react快速创建模板
    webstorm里面react快速创建模板rcc+tab键--用ES6模块系统创建一个React组件类rccp+tab键--创建一个带有PropTypes和ES6模块系统的React组件类rcfc+tab键-......
  • Path Finder系统文件管理工具 mac中文
    你认为MacOS上内建的Finder太有限了吗?pathfindermac版提供了Mac用户期望的功能,Finder应用程序可以证明对于基本文件管理任务已足够,但不提供太多自定义选项。PathFinder......
  • pat春季模拟考试+acwing第76周赛+AT276
    pat:模考58分,相较夏季赛差了不少1.模拟给定一个字符串,要求按照得分点和失分点进行模拟,求最后得分即可模拟比较难写参考小柳学渣大神的代码,大神码风和思路都很好1#i......
  • [Java反序列化]JavaCC链学习(8u71前)
    文章目录​​写在前面​​​​前置​​​​Transformer​​​​TransformedMap​​​​ChainedTransformer​​​​InvokerTransformer​​​​ConstantTransformer​​​​......
  • AC-automaton
    【模板】AC自动机postedon2022-06-1111:17:10|under模板|sourcetemplate<intN,intM=26,intD='a'>structacam{ intch[N+10][M],cnt[N+10],tot,fail[N+10]......
  • AcWing 95. 费解的开关
    第一个难点:如何枚举第一行的操作(指数类型的枚举,可以使用第一题的指数型枚举)这里使用二进制类型枚举11010=26反过来任何一个整数0-65536也可以用二进制表示0-31......
  • 基于PCM2706的USB-DAC(支持同轴、I²S输出)
    基于PCM2706的USB-DAC(支持同轴、I²S输出)简介:PCM2706是德州仪器公司的一款经典立体声16bitDAC解码芯片,集成HID人机控制接口与USBinterface,支持同轴信号输出(SPDI/F)、IIS数......
  • 关于 manacher 的一个小细节
    在该算法中,我们需要用到一个数组hw[i],代表i的最大回文半径。而且这个半径不包括i本身(若串为ccc则hw为1)。这时最终答案为最大的hw减一。为什么要减一呢?最终......