求助,不知道为什么样例能过但是提交显示编译错误
查看原帖
求助,不知道为什么样例能过但是提交显示编译错误
104695
Laplace0923楼主2024/10/27 08:57

代码如下

#include<bits/stdc++.h>
#define MAXN 1000
using namespace std;
int ch[MAXN][26],ne[MAXN],cnt[MAXN],idx;//ch包含Trie树边和转移边,ne为转移边,cnt为单词计数器,idx为编号器 
int num[MAXN],ans;
struct word{
	string name;
}index[MAXN];
void insert(string s){//构建第n号Trie树 
	int p=0;//记录节点标号
	for(int i=0;s[i];i++){
		int j=s[i]-'a';
		if(!ch[p][j]) ch[p][j]=++idx;
		p=ch[p][j];
	} 
	cnt[p]++;
	index[p].name=s;
}
void build(){//构建第n号AC自动机 
	queue<int> q;
	for(int i=0;i<26;i++)
		if(ch[0][i]) q.push(ch[0][i]);
	while(q.size()){
		int u=q.front();
		q.pop();
		for(int i=0;i<26;i++){
			int v=ch[u][i];
			if(v){
				ne[v]=ch[ne[u]][i];
				q.push(v);
			} 
			else ch[u][i]=ch[ne[u]][i];
		}
	}
} 
void search(string s){
	for(int k=0,i=0;s[k];k++){
		i=ch[i][s[k]-'a'];
		for(int j=i;j;j=ne[j]){
			if(cnt[j]) num[j]++;
			if(num[j]>ans) ans=num[j];
		}
	}
}
void output(){
	cout<<ans<<endl;
	for(int i=0;i<MAXN;i++){
		if(num[i]==ans) cout<<index[i].name<<endl;
	}
}
void clear(){
	memset(ch,0,sizeof(ch));
	memset(ne,0,sizeof(ne));
	memset(cnt,0,sizeof(cnt));
	memset(num,0,sizeof(num));
	idx=0;
	ans=0;
	for(int i=0;i<MAXN;++i) index[i].name.clear();     
}
int main(){
	while(1){
		clear();
		int N;
		cin>>N;
		cin.ignore();
		if(!N) break;
		for(int t=0;t<N;t++){
			string s;
			getline(cin,s);
			insert(s);
		}
		build();
		string s;
		getline(cin,s);
		search(s);
		output();
	}
	return 0;
}
2024/10/27 08:57
加载中...