请求帮我debug
查看原帖
请求帮我debug
1210041
ZJH234567楼主2024/7/18 15:21

code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e6+10;
int ch[N][26],ne[N],cnt[N],idx=1,n,que[N],vis[N],tot;
char s[N],s1[170][100];
inline void insert(char str[],int num){
	int p=1,len=strlen(str+1);
	for(int i=1;i<=len;i++){
		int u=str[i]-'a';
		if(!ch[p][u]) ch[p][u]=++idx;
		p=ch[p][u];
	}
	cnt[p]=num;
	return ;
}
inline void build(){
	for(int i=0;i<26;i++) ch[0][i]=1;
	ne[1]=0,que[1]=1;
	for(int q1=1,q2=1;q1<=q2;q1++)
	{
		int u=que[q1];
		for(int i=0;i<26;i++){
			if(!ch[u][i]) ch[u][i]=ch[ne[u]][i];
			else{
				que[++q2]=ch[u][i];
				ne[ch[u][i]]=ch[ne[u]][i];
			}
		}
	}
}
inline void query(char s[]){
	int u=1,len=strlen(s+1);
	for(int i=1;i<=len;i++){
		int v=s[i]-'a';
		int k=ch[u][v];
		while(k>1){
			if(cnt[k]) vis[cnt[k]]++;	
			k=ne[k];
		}
		u=ch[u][v];
	}
}
int main(){
	while(cin>>n,n){
		memset(cnt,0,sizeof cnt);
		memset(ne,0,sizeof ne);
		memset(vis,0,sizeof vis);
		memset(que,0,sizeof que);
		memset(ch,0,sizeof ch);
		memset(s1,'\0',sizeof s1);
		idx=1;
		for(int i=1;i<=n;i++)
		{
			scanf("%s",s1[i]+1);
			insert(s1[i]+1,i);
		}
		build();
		scanf("%s",s+1);
		query(s);
		int maxz=0;
		for(int i=1;i<=n;i++){
			maxz=max(maxz,vis[i]);
		}
		cout<<maxz<<endl;
		for(int i=1;i<=n;i++){
			if(vis[i]==maxz){
				printf("%s\n",s1[i]+1);
			}
		}
	}
	return 0;
}
2024/7/18 15:21
加载中...