Sol
Trie+(假的)DP
先把字典中的串加到Trie上
f[i]=1
表示这个串的第i位可以被理解
当
f[i]==1
时继续在Trie上匹配下一位(
f[i]==0
时不能break)
Code
// by spli
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e7;
int n,m;
struct Trie{
int son[26];
int end;
}ac[2000];int tot;
char s[N];
int len;
bool f[N];
void build(){
int now=0,ch;
len=strlen(s+1);
for(int i=1;i<=len;++i){
ch=s[i]-'a';
if(!ac[now].son[ch]) ac[now].son[ch]=++tot;
now=ac[now].son[ch];
}
ac[now].end=1;
}
void query(int st){
int now=0,ch;
for(int i=st;i<=len;++i){
ch=s[i]-'a';
now=ac[now].son[ch];
if(!now) return;
if(ac[now].end) f[i]=1;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%s",s+1);
build();
}
for(int i=1;i<=m;++i){
memset(f,0,sizeof(f));
scanf("%s",s+1);
len=strlen(s+1);
int ans=0;
query(1);
if(f[1]) ans=1;
for(int i=1;i<=len;++i)
if(f[i]){
ans=i;
query(i+1);
}
printf("%d\n",ans);
}
return 0;
}