[bzoj3998][TJOI2015]弦论_后缀自动机

弦论 bzoj-3998 TJOI-2015

题目大意:给定一个字符串,求其$k$小子串。

注释:$1\le length \le 5\cdot 10^5$,$1\le k\le 10^9$。


想法

后缀数组***题。

初学后缀自动机我们尝试用后缀自动机解决。

首先先建出$SAM$。

分别考虑$T=0$和$T=1$的情况。

我们处理$f$数组表示以当前节点代表的字符串为前缀的子串个数。

它们俩之间的区别就是$Right$集合的大小。

详情看代码把。

代码

#include <bits/stdc++.h>
#define N 1000010 
using namespace std;
int n,opt,nxt[N][26],fa[N],dis[N],lst=1,cnt=1,v[N],q[N],Right[N],f[N];
char str[N];
void update(int c)
{
    int p=lst,np=lst=++cnt;
    dis[np]=dis[p]+1; Right[np]=1;
    while(p&&!nxt[p][c]) nxt[p][c]=np,p=fa[p];
    if(!p) fa[np]=1;
    else
    {
        int q=nxt[p][c];
        if(dis[q]==dis[p]+1) fa[np]=q;
        else
        {
            int nq=++cnt;
            memcpy(nxt[nq],nxt[q],sizeof nxt[q]);
            dis[nq]=dis[p]+1; fa[nq]=fa[q]; fa[np]=fa[q]=nq;
            while(p&&nxt[p][c]==q) nxt[p][c]=nq,p=fa[p];
        }
    }
}
void init()
{
    for(int i=1;i<=cnt;i++) v[dis[i]]++;
    for(int i=1;i<=n;i++) v[i]+=v[i-1];
    for(int i=cnt;i;i--) q[v[dis[i]]--]=i;
    for(int i=cnt;i;i--)
    {
        int t=q[i];
        if(opt) Right[fa[t]]+=Right[t];
        else Right[t]=1;
    }
    Right[1]=0; for(int i=cnt;i;i--)
    {
        int t=q[i]; f[t]=Right[t];
        for(int j=0;j<26;j++) f[t]+=f[nxt[t][j]];
    }
}
void query(int p,int k)
{
    if(k<=Right[p]) return;
    k-=Right[p];
    for(int i=0;i<26;i++) if(nxt[p][i])
    {
        if(k<=f[nxt[p][i]])
        {
            putchar(i+'a'); query(nxt[p][i],k);
            return;
        }
        k-=f[nxt[p][i]];
    }
}
int main()
{
    int k; scanf("%s%d%d",str+1,&opt,&k); n=strlen(str+1);
    for(int i=1;i<=n;i++) update(str[i]-'a');
    init();
    if(k>f[1]) puts("-1");
    else query(1,k);
    return 0;
}

小结:后缀自动机搭配其他的数据结构的时候会比较有用,但是感觉后缀数组更好写啊$qwq$......

全部评论

相关推荐

这不纯纯作弊了吗😢😢😢
编程界菜鸡:信这个的这辈子有了,这智商你靠啥都没用
点赞 评论 收藏
分享
吴offer选手:HR:我KPI到手了就行,合不合适关我什么事
点赞 评论 收藏
分享
就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务