这道题目写得好暴力可能都能过吧(←乱说的别理他( ̄_, ̄ ))。大概用Tire做到O(N*len),其中len表示一个单词的长度。实际上也非常好写,如果用刷表法也就30行代码。。一不小心把Tire开大了MLE了一下然后差点刷到第一页(←这也能拿出来说,就这点出息)。
AC代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1300005
using namespace std;
int n,m,tot,len,ch[305][26]; bool bo[N],f[N]; char s[N];
void updata(int x){
int now=ch[0][s[x]-'a'];
for (; now; now=ch[now][s[++x]-'a']){ if (bo[now]) f[x]=1; if (x==len) return; }
}
int main(){
scanf("%d%d",&n,&m); int i,j;
for (i=1; i<=n; i++){
scanf("%s",s); int now=0;
for (j=0; s[j]; j++){
int x=s[j]-'a'; if (!ch[now][x]) ch[now][x]=++tot;
now=ch[now][x];
}
bo[now]=1;
}
for (i=1; i<=m; i++){
scanf("%s",s+1); len=strlen(s+1); int t=0,ans;
memset(f,0,sizeof(f)); f[0]=1;
for (j=0; j<=len; j++){
if (t>10) break; if (!f[j]){ t++; continue; }
t=0; ans=j; updata(j+1);
}
printf("%d\n",ans);
}
return 0;
}
by lych
2016.2.6