挺简单的Trie加DP,直接贴代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define maxl 1100010
using namespace std;
char st[20],T[maxl];
int len;
struct Trie{
int sz;
int ch[300][30];
bool isw[300],f[maxl];//若f[i]=1表示长度为i的前缀可以在字典中得到理解
int idx(char c){return c-'a';}
void init(){
sz=0;
memset(ch,0,sizeof(ch));
memset(isw,0,sizeof(isw));
}
void insert(char*s){
int u=0;
for(int i=0;i<len;i++){
int c=idx(s[i]);
if(!ch[u][c])ch[u][c]=++sz;
u=ch[u][c];
}
isw[u]=1;
}
int solve(char*T){
memset(f,0,sizeof(f));
f[0]=1;
for(int i=0;i<len;i++)if(f[i])query(T,i);
for(int i=len;~i;i--)if(f[i])return i;
}
void query(char*T,int l){
int u=0;
for(int i=l;i<len;i++){
int c=ch[u][idx(T[i])];
if(!c)break;
if(isw[c])f[i+1]=1;
u=c;
}
}
}P;
int n,m;
void getst(char*st){
len=0;
for(char c=getchar();c!='\n'&&c!=EOF&&c!=' ';c=getchar())st[len++]=c;
}
int main(){
freopen("1212.in","r",stdin);
scanf("%d%d",&n,&m);
getchar();
P.init();
for(int i=0;i<n;i++){
getst(st);
P.insert(st);
}
while(m--){
getst(T);
printf("%d\n",P.solve(T));
}
return 0;
}