博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SP7258 SUBLEX - Lexicographical Substring Search(后缀自动机)
阅读量:5343 次
发布时间:2019-06-15

本文共 1092 字,大约阅读时间需要 3 分钟。

解题思路

  首先建\(sam\),然后在拓扑序上\(dp\)一下,把每个点的路径数算出来,然后统计答案时就在自动机上\(dfs\)一下,仿照平衡树那样找第\(k\)小。

代码

#include
#include
#include
#include
using namespace std;const int MAXN = 90005;inline int rd(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); return f?x:-x;}int n,Q,l[MAXN<<1],fa[MAXN<<1],ch[MAXN<<1][27];int lst,cnt,f[MAXN<<1],c[MAXN<<1],a[MAXN<<1];char s[MAXN];inline void Insert(int c){ int p=lst,np=++cnt;lst=np;l[np]=l[p]+1; for(;p && !ch[p][c];p=fa[p]) ch[p][c]=np; if(!p) fa[np]=1; else { int q=ch[p][c]; if(l[q]==l[p]+1) fa[np]=q; else{ int nq=++cnt;l[nq]=l[p]+1; memcpy(ch[nq],ch[q],sizeof(ch[q])); fa[nq]=fa[q];fa[q]=fa[np]=nq; for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nq; } }} void query(int x){ int p=1; while(x){ for(int i=1;i<=26;i++)if(ch[p][i]){ if(f[ch[p][i]]

转载于:https://www.cnblogs.com/sdfzsyq/p/10106145.html

你可能感兴趣的文章
建造者模式
查看>>
ArraySort--冒泡排序、选择排序、插入排序工具类demo
查看>>
composer 安装laravel
查看>>
8-EasyNetQ之Send & Receive
查看>>
Android反编译教程
查看>>
List<string> 去重复 并且出现次数最多的排前面
查看>>
js日志管理-log4javascript学习小结
查看>>
Android之布局androidmanifest.xml 资源清单 概述
查看>>
How to Find Research Problems
查看>>
Linux用户管理
查看>>
数据库第1,2,3范式学习
查看>>
《Linux内核设计与实现》第四章学习笔记
查看>>
使用iperf测试网络性能
查看>>
图片的显示隐藏(两张图片,默认的时候显示第一张,点击的时候显示另一张)...
查看>>
Docker 安装MySQL5.7(三)
查看>>
python 模块 来了 (调包侠 修炼手册一)
查看>>
关于CSS的使用方式
查看>>
本地MongoDB服务开启与连接本地以及远程服务器MongoDB服务
查看>>
跨域解决方案之CORS
查看>>
分析语句执行步骤并对排出耗时比较多的语句
查看>>