模板——字符串

AC自动机

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+2,M=26;
int n,m,k,t[N][M],d[N],s[N],f[N],c[152]; char a[152][72],b[N];  
void build(){
	memset(t,0,sizeof(t)); memset(s,0,sizeof(s)); 
	memset(f,0,sizeof(f)); memset(c,0,sizeof(c)); m=0; 
	for(int i=1;i<=k;i++){
		scanf("%s",a[i]); n=strlen(a[i]); int u=0; 
		for(int j=0;j<n;j++){
			int x=a[i][j]-97;  
			if(!t[u][x]) t[u][x]=++m; 
			u=t[u][x]; if(j==n-1) d[u]=i,s[u]++; 
		}
	}
}
void bfs(){
	queue<int>q; for(int i=0;i<M;i++) if(t[0][i]) q.push(t[0][i]); 
	while(!q.empty()){ 
		int u=q.front(); q.pop(); 
		for(int i=0;i<M;i++){
			if(t[u][i]) f[t[u][i]]=t[f[u]][i],q.push(t[u][i]); 
			else t[u][i]=t[f[u]][i]; 
		}
	}
}
void query(){
	scanf("%s",b); n=strlen(b); int j=0; 
	for(int i=0;i<n;i++){
		int x=b[i]-97; j=t[j][x]; int k=j; 
		while(k) c[d[k]]+=s[k],k=f[k]; 
	}
	int mx=0; for(int i=1;i<=k;i++) mx=max(mx,c[i]); 
	cout<<mx<<endl; 
	for(int i=1;i<=k;i++) if(c[i]==mx) printf("%s\n",a[i]); 
}
int main()
{
	while(scanf("%d",&k) && k) build(),bfs(),query(); 
	return 0;
}

SAM

点击查看代码
struct SAM{
	int n,p,l[N],f[N],x[N],t[N][M];
	void insert(int w){
		int u=++n,v=p;
		p=u; l[u]=l[v]+1; x[u]=1;
		for(;(v && !t[v][w]);v=f[v]) t[v][w]=u;
		if(!v){
			f[u]=1;
			return;
		}
		int q=t[v][w];
		if(l[q]==l[v]+1){
			f[u]=q;
			return;
		}
		int c=++n;
		l[c]=l[v]+1; f[c]=f[q]; memcpy(t[c],t[q],sizeof(t[q])); 
		for(;(v && t[v][w]==q);v=f[v]) t[v][w]=c;
		f[u]=f[q]=c; 
	}
	void build(char* a,int m){
		n=p=1;
		for(int i=0;i<m;i++) insert(a[i]-97);
	}
}S;
posted @   sz[sz]  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示