长度小于 10 是关键信息~
#include <cstdio> #include <cstring> #include <algorithm> #define N 1000000 #define setIO(s) freopen(s".in","r",stdin) using namespace std; struct Node { int ch[27],end,len; }t[N]; int n,m,tot,f[N]; char S[N]; void insert(int i) { int rt=0,len=strlen(S+1),j; for(j=len;j>=1;--j) { if(!t[rt].ch[S[j]-'a']) t[rt].ch[S[j]-'a']=++tot; t[t[rt].ch[S[j]-'a']].len=t[rt].len+1; rt=t[rt].ch[S[j]-'a']; } t[rt].end=1; } int main() { int i,j; // setIO("input"); scanf("%d%d",&n,&m); for(i=1;i<=n;++i) scanf("%s",S+1),insert(i); f[0]=1; for(int cas=1;cas<=m;++cas) { scanf("%s",S+1); int len=strlen(S+1); for(i=1;i<=len;++i) { int p=0; f[i]=0; for(j=i;j>=1;--j) { p=t[p].ch[S[j]-'a']; if(!p) break; if(t[p].end) f[i]|=f[j-1]; } } int MX=0; for(i=1;i<=len;++i) { if(f[i]) { MX=i; } } printf("%d ",MX); } return 0; }