开始一看多个字符串就想ac自动机,结果发现不行。果然学傻了,,,,只要建个trie然后刷表dp就行了,复杂度最坏是O(字典中最长单词长度*文章长度)的。trie的空间换时间挺不错的。
#include<iostream> #include<cmath> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; const int maxn=250,maxm=1000010; int n,m,f[maxm],ch[maxn][26],vis[maxn],t; char ss[maxm]; void add(){ int len=strlen(ss+1),u=0; for(int i=1;i<=len;++i){ if(!ch[u][ss[i]-'a'])ch[u][ss[i]-'a']=++t; u=ch[u][ss[i]-'a']; } vis[u]=1; } int solve(){ int u,len=strlen(ss+1),ans; for(int i=1;i<=len+1;++i)f[i]=0; f[0]=1; for(int i=0;i<=len;++i)if(f[i]){ ans=i;u=0; for(int j=i;j<=len;++j){ if(vis[u])f[j]=1; if(j==len||!(u=ch[u][ss[j+1]-'a']))break; } } return ans; } int main(){ cin>>n>>m; for(int i=1;i<=n;++i){ scanf("%s",ss+1);add(); } for(int i=1;i<=m;++i){ scanf("%s",ss+1); printf("%d\n",solve()); } system("pause"); return 0; }