开始一看多个字符串就想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;
}

 

posted on 2018-01-19 10:46  湮灭之瞳  阅读(109)  评论(0编辑  收藏  举报