• TJOI2015 弦论


    题目链接:戳我

    SAM经典应用,求字典序第K小的子串

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #define MAXN 555555
    using namespace std;
    int n,m,tot=1,last=1,T,K;
    int siz[MAXN<<1],f[MAXN<<1],a[MAXN<<1],c[MAXN<<1];
    char s[MAXN];
    struct Node{int ch[26],ff,len;}t[MAXN<<1];
    inline void extend(int c)
    {
        int p=last,np=++tot;last=np;
        t[np].len=t[p].len+1;
        while(p&&!t[p].ch[c]) t[p].ch[c]=np,p=t[p].ff;
        if(!p) t[np].ff=1;
        else 
        {
            int q=t[p].ch[c];
            if(t[q].len==t[p].len+1) t[np].ff=q;
            else
            {
                int nq=++tot;
                t[nq]=t[q],t[nq].len=t[p].len+1;
                t[np].ff=t[q].ff=nq;
                while(p&&t[p].ch[c]==q) t[p].ch[c]=nq,p=t[p].ff;
            }
        }
        siz[np]=1;
    }
    inline void query(int x,int k)
    {
        if(k<=siz[x]) return;
        k-=siz[x];
        for(int i=0;i<26;i++)
        {
            if(!t[x].ch[i]) continue;
            if(f[t[x].ch[i]]<k) k-=f[t[x].ch[i]];
            else
            {
                printf("%c",'a'+i);
                query(t[x].ch[i],k);
                return;
            }
        }
    }
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("ce.in","r",stdin);
        freopen("ce.out","w",stdout);
        #endif
        scanf("%s",s+1);
        scanf("%d%d",&T,&K);
        for(int i=1,len=strlen(s+1);i<=len;i++) extend(s[i]-97);
        for(int i=1;i<=tot;i++) c[t[i].len]++;
        for(int i=1;i<=tot;i++) c[i]+=c[i-1];
        for(int i=1;i<=tot;i++) a[c[t[i].len]--]=i;
        for(int i=tot;i;i--) siz[t[a[i]].ff]+=siz[a[i]];
        for(int i=1;i<=tot;i++)
        {
            if(T==0) f[i]=siz[i]=1;
            else f[i]=siz[i];
        }
        f[1]=siz[1]=0;
        for(int i=tot;i;i--)
            for(int j=0;j<26;j++)
                if(t[a[i]].ch[j])
                    f[a[i]]+=f[t[a[i]].ch[j]];
        if(K>f[1]) printf("-1
    ");
        else query(1,K);
        return 0;
    }
    
  • 相关阅读:
    用python实现批量替换.doc文件文件内容
    记我是如何通过Security+考试的
    去哪儿笔试羊生羊问题
    CSS作用域问题
    常用的几种清除浮动的方式
    ECE转专业找工作经历-从零电面到facebook offer
    面经-Bloomberg
    题解-Linked List Cycle II
    自我介绍
    解题技巧-发现子结构
  • 原文地址:https://www.cnblogs.com/fengxunling/p/10975539.html
Copyright © 2020-2023  润新知