参考第一篇题解,但是就是这么玄学。
#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;
}