bzoj 1212 [HNOI2004]L语言

来源:互联网 发布:受力分析软件 编辑:程序博客网 时间:2024/05/22 09:39

吃什么


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;}