BZOJ 3998 [TJOI2015]弦论

本文介绍使用后缀自动机解决寻找字符串中第K小子串的问题,包括输入输出格式、样例及实现思路。通过构建后缀自动机并进行适当的修改,可以有效地解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

对于一个给定长度为N的字符串,求它的第K小子串是什么。

Input

第一行是一个仅由小写英文字母构成的字符串S
第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个。T=1则表示不同位置的相同子串算作多个。K的意义如题所述。

Output

输出仅一行,为一个数字串,为第K小的子串。如果子串数目不足K个,则输出-1

Sample Input

aabc
0 3

Sample Output

aab

HINT

N<=5*10^5
T<2
K<=10^9

Source

思路

后缀自动机,由于后缀自动机对应每一个字串,那么只需要记录每个字串的sizesize,当T=0T=0时为11,当T=1时为他的parentparent树上的子树大小(注意在这种情况下只能计算插入字符中的npnp,而不能将nqnq计算在内)。

代码

#include <cstdio>
#include <cstring>

const int maxn=500000;
const int maxk=1000000;

struct node
{
  node* tr[26];
  node* par;
  int maxl,size,sum;

  node()
  {
    memset(tr,0,sizeof tr);
    par=NULL;
    maxl=size=sum=0;
  }
};

struct suffix_automaton
{
  node samnode[maxk+10];
  node* pps[maxk+10];
  node* qs;
  node* qlast;
  int cnt,tmp[maxk+10];

  suffix_automaton()
  {
    delete qs;
    delete qlast;
    qlast=qs=new node();
    cnt=0;
  }

  inline int addchr(int ch)
  {
    node* p=qlast;
    node* np=samnode+ ++cnt;
    np->size=1;
    np->maxl=qlast->maxl+1;
    qlast=np;
    while((p!=NULL)&&(p->tr[ch]==NULL))
      {
        p->tr[ch]=np;
        p=p->par;
      }
    if(p==NULL)
      {
        np->par=qs;
        return 0;
      }
    node* q=p->tr[ch];
    if(q->maxl!=p->maxl+1)
      {
        node* nq=samnode+ ++cnt;
        nq->size=0;
        nq->maxl=p->maxl+1;
        memcpy(nq->tr,q->tr,sizeof q->tr);
        nq->par=q->par;
        q->par=np->par=nq;
        while((p!=NULL)&&(p->tr[ch]==q))
          {
            p->tr[ch]=nq;
            p=p->par;
          }
      }
    else
      {
        np->par=q;
      }
    return 0;
  }

  inline int sort_maxl()
  {
    for(register int i=1; i<=cnt; ++i)
      {
        ++tmp[samnode[i].maxl];
      }
    for(register int i=2; i<=cnt; ++i)
      {
        tmp[i]+=tmp[i-1];
      }
    for(register int i=cnt; i; --i)
      {
        pps[tmp[samnode[i].maxl]--]=samnode+i;
      }
    return 0;
  }

  inline int calc_size(int t)
  {
    if(t)
      {
        for(register int i=cnt; i; --i)
          {
            if(pps[i]->par!=qs)
              {
                pps[i]->par->size+=pps[i]->size;
              }
          }
      }
    else
      {
        for(register int i=1; i<=cnt; ++i)
          {
            samnode[i].size=1;
          }
      }
    for(register int i=cnt; i; --i)
      {
        pps[i]->sum=pps[i]->size;
        for(register int j=0; j<26; ++j)
          {
            if(pps[i]->tr[j]!=NULL)
              {
                pps[i]->sum+=pps[i]->tr[j]->sum;
              }
          }
      }
    return 0;
  }

  inline int dfs(node* p,int k)
  {
    if(p->size>=k)
      {
        return 0;
      }
    k-=p->size;
    for(register int i=0; i<26; ++i)
      {
        if(p->tr[i]!=NULL)
          {
            if(p->tr[i]->sum>=k)
              {
                putchar(i+'a');
                dfs(p->tr[i],k);
                return 0;
              }
            k-=p->tr[i]->sum;
          }
      }
    return 0;
  }

  inline int check(int k)
  {
    for(register int i=0; i<26; ++i)
      {
        if(qs->tr[i]!=NULL)
          {
            k-=qs->tr[i]->sum;
          }
      }
    if(k>0)
      {
        return 1;
      }
    return 0;
  }
};

suffix_automaton sam;
int n,k,t;
char s[maxn+10];

int main()
{
  scanf("%s",s+1);
  n=strlen(s+1);
  for(register int i=1; i<=n; ++i)
    {
      sam.addchr(s[i]-'a');
    }
  sam.sort_maxl();
  scanf("%d%d",&t,&k);
  sam.calc_size(t);
  if(sam.check(k))
    {
      puts("-1");
      return 0;
    }
  sam.dfs(sam.qs,k);
  return 0;
}
内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值