玄学50分,第4个点wa,7,8,9RE
查看原帖
玄学50分,第4个点wa,7,8,9RE
177604
LXH5514楼主2021/1/29 20:09

参考第一篇题解,但是就是这么玄学。

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<map>
using namespace std;
int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+f*(c-'0'),c=getchar();
	return x;
}
const int MAXN=30000;
int n,m;
int a[MAXN][40],pos;
int b[MAXN];
void insert(char x[])
{
	int p=0;
	int len=strlen(x);
	for(int i=0;i<len;i++)
	{
		if(a[p][x[i]-'a']==0)a[p][x[i]-'a']=++pos;
		p=a[p][x[i]-'a'];
	}
	b[p]++;
	return ;
}
int f[2100000+10];
map<string,int>mm;
void query()
{
	char s[210000+10];
	scanf("%s",s+1);
	int len=strlen(s+1);
	int ans=0;
	if(mm[s+1]>=1)
	{
		printf("%d\n",mm[s+1]);
		return ;
	}
	f[0]=1;
	for(int i=0;i<=len;i++)
	{
		if(f[i]==0)continue;
		for(int j=i+1,p=0;j<=len;j++)
		{
			if(a[p][s[j]-'a']==0)break;
			if(b[a[p][s[j]-'a']]>=1)ans=j,f[j]=1;
			p=a[p][s[j]-'a'];
		}
	}
	printf("%d\n",ans);
	mm[s+1]=ans;
	for(int i=0;i<len;i++)
	f[i]=0;
	return ;
}
int main()
{
	n=read();
	m=read();
	for(int i=1;i<=n;i++)
	{
		char s[MAXN];
		scanf("%s",s);
		insert(s);
	}
	for(int i=0;i<m;i++)
	query();
 	return 0;
}
2021/1/29 20:09
加载中...