当前位置: 首页 > news >正文

BZOJ3998:[TJOI2015]弦论——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=3998

https://www.luogu.org/problemnew/show/P3975

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

后缀自动机,对l排序然后从后往前推size和sum数组(貌似也可以叫拓扑?)。

size:当前状态的字符串个数(贡献)。

sum:以当前状态为起点之后的满足要求的字符串个数。

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
typedef long long ll;
const int N=1e6+5;
struct tree{
    int a[26],fa,l;
}tr[N];
char s[N];
int last,cnt,t,k;
ll a[N],w[N],size[N],sum[N];
inline void insert(int c){
    int p=last,np=++cnt;
    last=np;tr[np].l=tr[p].l+1;
    for(;p&&!tr[p].a[c];p=tr[p].fa)tr[p].a[c]=np;
    if(!p)tr[np].fa=1;
    else{
    int q=tr[p].a[c];
    if(tr[p].l+1==tr[q].l)tr[np].fa=q;
    else{
        int nq=++cnt;tr[nq].l=tr[p].l+1;
        memcpy(tr[nq].a,tr[q].a,sizeof(tr[q].a));
        tr[nq].fa=tr[q].fa;tr[q].fa=tr[np].fa=nq;
        for(;p&&tr[p].a[c]==q;p=tr[p].fa)tr[p].a[c]=nq;
    }
    }
    size[np]=1;
}
int main(){
    scanf("%s%d%d",s,&t,&k);
    int len=strlen(s);
    last=cnt=1;
    for(int i=0;i<len;i++)insert(s[i]-'a');
    for(int i=1;i<=cnt;i++)w[tr[i].l]++;
    for(int i=1;i<=len;i++)w[i]+=w[i-1];
    for(int i=1;i<=cnt;i++)a[w[tr[i].l]--]=i;
    for(int i=cnt;i>=1;i--){
    if(t)size[tr[a[i]].fa]+=size[a[i]];
    else size[a[i]]=1;
    }
    size[1]=0;
    for(int i=cnt;i>=1;i--){
    sum[a[i]]=size[a[i]];
    for(int j=0;j<26;j++)
        if(tr[a[i]].a[j])
        sum[a[i]]+=sum[tr[a[i]].a[j]];
    }
    if(k>sum[1])puts("-1");
    else{
    int now=1;
    while(k>size[now]){
        k-=size[now];
        int i;
        for(int i=0;i<26;i++){
        if(k>sum[tr[now].a[i]])
            k-=sum[tr[now].a[i]];
        else{
            now=tr[now].a[i];
            putchar(i+'a');
            break;
        }
        }
    }
    puts("");
    }
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8776119.html

相关文章:

  • 3、第一个Appium测试
  • 【代码片段】Python发送带图片的邮件
  • @Autowired @Resource @Qualifier的区别
  • 区块链学习路线
  • Activity事件分发机制
  • ListT常用操作函数
  • Tomcat 的连接数与线程池
  • JVM内存模型
  • windows下安装redis以及redis扩展,设置redis为windows自启服务
  • HTML中动态生成内容的事件绑定问题
  • Scala学习之路 (五)Scala的关键字Lazy
  • ListView封装实现下拉刷新和上拉加载
  • 搜狗旅行翻译宝亮相香港环球资源电子展 AI翻译成全场最大亮点
  • 43.AzureVM复制到另一个Azure区域
  • 如何在虚拟机中访问真机的虚拟域名
  • 【译】JS基础算法脚本:字符串结尾
  • Java多线程(4):使用线程池执行定时任务
  • js ES6 求数组的交集,并集,还有差集
  • MobX
  • Redis字符串类型内部编码剖析
  • webpack入门学习手记(二)
  • 爱情 北京女病人
  • 创建一个Struts2项目maven 方式
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 通过npm或yarn自动生成vue组件
  • 仓管云——企业云erp功能有哪些?
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • (1)常见O(n^2)排序算法解析
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (一)插入排序
  • (转)linux 命令大全
  • (转)负载均衡,回话保持,cookie
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • ../depcomp: line 571: exec: g++: not found
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 命令行参数包含应用程序路径吗?
  • .php文件都打不开,打不开php文件怎么办
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [Google Guava] 1.1-使用和避免null
  • [HNOI2008]水平可见直线
  • [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信
  • [Linux] PXE批量装机
  • [NOI2005]月下柠檬树[计算几何(simpson)]
  • [PAT] 1041 Be Unique (20 分)Java
  • [PHP]禅道项目管理软件ZenTaoPMS源码包 v16.4
  • [python-opencv] PNG 裁切物体
  • [SCM]源码管理 - perforce高级操作
  • [UDS] --- CommunicationControl 0x28
  • [Unity+智谱AI开放平台]调用ChatGLM Tuobo模型驱动AI小姐姐数字人
  • [Web开发] 如何改变IE滚动条的颜色