zoukankan      html  css  js  c++  java
  • [BZOJ1212][HNOI2004]L语言

    BZOJ
    Luogu

    sol

    (f_i)表示文章的前(i)个字符是否可以被理解。每次匹配要暴跳(fail)到根,转移就是(f_i|=f_{i-len}),其中(len)是某个可以匹配的模式串的串长。

    code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    const int N = 100005;
    int n,m,ch[26][N],fail[N],dep[N],tot,len,f[N*10];
    char s[N*10];
    queue<int>Q;
    void Insert()
    {
        scanf("%s",s);len=strlen(s);
        int x=0;
        for (int i=0;i<len;i++)
        {
            if (!ch[s[i]-'a'][x]) ch[s[i]-'a'][x]=++tot;
            x=ch[s[i]-'a'][x];
        }
        dep[x]=len;
    }
    void Get_Fail()
    {
        for (int i=0;i<26;i++) if (ch[i][0]) Q.push(ch[i][0]);
        while (!Q.empty())
        {
            int u=Q.front();Q.pop();
            for (int i=0;i<26;i++)
                if (ch[i][u]) fail[ch[i][u]]=ch[i][fail[u]],Q.push(ch[i][u]);
                else ch[i][u]=ch[i][fail[u]];
        }
    }
    void Query()
    {
        scanf("%s",s+1);len=strlen(s+1);
        memset(f,0,sizeof(f));f[0]=1;
        for (int i=1,x=0;i<=len;i++)
        {
            x=ch[s[i]-'a'][x];
            for (int t=x;t;t=fail[t])
                f[i]|=f[i-dep[t]];
        }
        for (int i=len;i>=0;i--) if (f[i]) return (void)printf("%d
    ",i);
    }
    int main()
    {
        scanf("%d %d",&n,&m);
        for (int i=1;i<=n;i++) Insert();
        Get_Fail();
        for (int i=1;i<=m;i++) Query();
        return 0;
    }
    
  • 相关阅读:
    Linux JDK安装
    Redis集群搭建
    Struts2 中添加 Servlet
    js小技巧:数组去重
    修改Request 中的数据
    JAVA 图形界面开发基础详解
    JAVA 类和对象基础知识详解
    Java 类的继承详解
    C++ 大学课堂知识点总结
    数据库简单练习 建表+select
  • 原文地址:https://www.cnblogs.com/zhoushuyu/p/8350062.html
Copyright © 2011-2022 走看看