求助,连样例都没过
查看原帖
求助,连样例都没过
523525
徐天乾楼主2021/8/12 14:33
#include <iostream>
#include<bits/stdc++.h>
#define M 1000100
using namespace std;
int i,n,x,v,u,w,len,tot,c[M],e[M],f[M][27],ans[M],fail[M];
queue<int> Q;char s[M],a[155][75]; 
void clear(queue<int>& q) {queue<int> empty;swap(empty,q);}
void ins(char *s,int I){
	len=strlen(s+1);v=1;
	for (int i=1;i<=len;i++){
		u=s[i]-97;
		if (!f[v][u]) f[v][u]=++tot; 
		v=f[v][u]; 
	}
	e[v]=I;
}
void bfs(){
	for (i=0;i<26;i++)
		if (f[1][i])
			fail[f[1][i]]=1,Q.push(f[1][i]);
	while (!Q.empty()){
		u=Q.front();Q.pop();
		for (i=0;i<26;i++){
			v=f[u][i];
			if (v) Q.push(v),fail[v]=f[fail[u]][i]?f[fail[u]][i]:1;	
			else f[u][i]=f[fail[u]][i];
		}
	}
}
void find(char *s){
	len=strlen(s+1);v=1;
	for (i=1;i<=len;i++){
		u=s[i]-97; w=f[v][u];
		while (w){
			if (e[w]) ans[e[w]]++;
			w=fail[w];
		}
		v=f[v][u];
	}
}
int main(){
	scanf("%d",&n);
	while (n){
		memset(e,0,sizeof(e));memset(f,0,sizeof(f));clear(Q);tot=1;
		memset(ans,0,sizeof(ans));memset(fail,0,sizeof(fail));
		for (i=1;i<=n;i++)
			scanf("%s",a[i]+1),ins(a[i],i);
		bfs();	scanf("%s",s+1); find(s);
		for (i=1,x=0;i<=n;i++)
			if (ans[i]>ans[x]) x=i;
		printf("%d\n",ans[x]);
		for (i=1;i<=n;i++)
			if (ans[i]==ans[x])
				printf("%s\n",a[i]+1);
		scanf("%d",&n);
	}
	return 0;
}

【模板】AC自动机(简单版)这题对了,然后在原代码的基础上编这题。调了2个小时都没对,求大佬帮助

2021/8/12 14:33
加载中...