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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现