zoukankan      html  css  js  c++  java
  • bzoj1212(trie+dp)

    开始一看多个字符串就想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
    ",solve());
        }
        system("pause");
        return 0;
    }
  • 相关阅读:
    LeetCode90.子集 ||
    Ubuntu下的Matlab安装
    FAQ
    青石板
    交叉熵损失函数
    tf常用函数
    激活函数
    SGD和GD的区别
    卷积神经网络
    Ubuntu安装Matlab2016b
  • 原文地址:https://www.cnblogs.com/dibaotianxing/p/8315777.html
Copyright © 2011-2022 走看看