bzoj 1212 L语言 Trie+DP

来源:互联网 发布:c 变量定义数组长度 编辑:程序博客网 时间:2024/05/19 14:51

f[ i ] 为串前i位能否被理解,单词长不超过10,所以f[ i ]可以暴力转移……

#include<cstdio>#include<cstring>#include<iostream>#define maxn 205using namespace std;char s[1500005];struct Trie{    int val[maxn];    int ch[maxn][27],cnt;    void insert()    {        int p=0;        int n=strlen(s+1);        for(int i=1;i<=n;i++)        {            int c=s[i]-'a'+1;            if(!ch[p][c]) ch[p][c]=++cnt;            p=ch[p][c];        }        val[p]++;    }    bool find(int x,int y)    {        int p=0;        for(int i=x;i<=y;i++)        {            int c=s[i]-'a'+1;            if(!ch[p][c]) return false;            p=ch[p][c];        }        if(val[p]) return true;        return false;    }}trie;bool f[1500005];int main(){    int n,m,l=0;    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)    {        scanf("%s",s+1);        trie.insert();int p=strlen(s+1);        l=max(l,p);    }    while(m--)    {        f[0]=1;        scanf("%s",s+1);        int len=strlen(s+1);        for(int i=1;i<=len;i++)        {            f[i]=0;            for(int j=l;j>0;j--)            {                if(i-j<0) continue;                if(f[i-j]&&trie.find(i-j+1,i))                {f[i]=1;break;}            }        }        int ans=0;        for(int i=len;i>=1;i--)            if(f[i]==1){ans=i;break;}        printf("%d\n",ans);    }    return 0;}
1 0
原创粉丝点击