求助:trie
查看原帖
求助:trie
253936
simonG楼主2022/3/14 22:09

link
5TLE
代码:

#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=2e6;
int n,m,ch[MAXN+10][30],tot=1,ans;
char s[MAXN+10];
bool ed[MAXN+10],vis[MAXN+10];
void Insert(char *s) {
	int n=strlen(s),u=1;
	for(int i=0; i<n; i++) {
		int c=s[i]-'a';
		if(ch[u][c]) u=ch[u][c];
		else {
			ch[u][c]=++tot;
			u=ch[u][c];
		}
	}
	ed[u]=1;
}
void Query(int x,char *s) {
	if(vis[x]) return ;
	vis[x]=1;
	ans=max(ans,x);
	int u=1;
	for(int i=x; i<strlen(s); i++) {
		int c=s[i]-'a';
		if(!ch[u][c]) return ;
		else u=ch[u][c];
		if(ed[u]) Query(i+1,s);
	}
	if(!ed[u]) return ;
	ans=strlen(s);
}
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) {
		scanf("%s",s);
		Insert(s);
	}
	for(int i=1; i<=m; i++) {
		scanf("%s",s);
		memset(vis,0,sizeof(vis));
		ans=0;
		Query(0,s);
		printf("%d\n",ans);
	}
	return 0;
}
2022/3/14 22:09
加载中...