• 【HDU4622】Reincarnation-后缀自动机


    测试地址:Reincarnation
    题目大意:给定一个字符串sq个询问,每次询问s的一个子串s[l,r]内有多少个不同的子串。
    做法:本题需要用到后缀自动机。
    注意到一个子串就是一个后缀的一个前缀,而对于求一个串所有前缀中有多少个不同的子串显然可以用后缀自动机维护,所以我们对每个后缀都建一遍后缀自动机,同时求出ans(l,r),然后O(1)回答询问即可。时间复杂度为O(|s|2)
    以下是本人代码:

    #include <bits/stdc++.h>
    using namespace std;
    int T,n,m,tot,last,totans,ans[2010][2010];
    int pre[4010],len[4010],ch[4010][26];
    char s[2010];
    
    void extend(char c)
    {
        int p,q,np,nq;
        np=++tot;
        len[np]=len[last]+1;
        p=last;
        while(p&&!ch[p][c-'a']) ch[p][c-'a']=np,p=pre[p];
        if (!p) pre[np]=1;
        else
        {
            q=ch[p][c-'a'];
            if (len[p]+1==len[q]) pre[np]=q;
            else
            {
                nq=++tot;
                len[nq]=len[p]+1;
                pre[nq]=pre[q];
                for(int i=0;i<26;i++)
                    ch[nq][i]=ch[q][i];
                while(p&&ch[p][c-'a']==q) ch[p][c-'a']=nq,p=pre[p];
                pre[np]=pre[q]=nq;
            }
        }
        totans+=len[np]-len[pre[np]];
        last=np;
    }
    
    int main()
    {
        scanf("%d",&T);
        while(T--)
        {
            scanf("%s",s);
            n=strlen(s);
    
            for(int i=1;i<=n;i++)
            {
                tot=last=1;
                pre[1]=len[1]=0;
                memset(ch,0,sizeof(ch));
                totans=0;
                for(int j=i;j<=n;j++)
                {
                    extend(s[j-1]);
                    ans[i][j]=totans;
                }
            }
    
            scanf("%d",&m);
            for(int i=1;i<=m;i++)
            {
                int l,r;
                scanf("%d%d",&l,&r);
                printf("%d
    ",ans[l][r]);
            }
        }
    
        return 0;
    }
  • 相关阅读:
    jquery插件:web2.0分格的分页脚,可用于ajax无刷新分页
    Application共享数据
    WebClient类
    HttpResponse类
    IEqualityComparer<T>接口
    物理数据库设计 理解浮点数
    Server对象,HttpServerUtility类,获取服务器信息
    Linq to OBJECT之非延时标准查询操作符
    IComparer<T> 接口Linq比较接口
    会话状态Session
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793484.html
Copyright © 2020-2023  润新知