BZOJ 3998: [TJOI2015]弦论 后缀自动机 后缀自动机求第k小子串
http://www.lydsy.com/JudgeOnline/problem.php?id=3998
后缀自动机应用的一个模板?需要对len进行一个排序之后再统计每个出现的数量,维护的是以该字符串为前缀的字符串数量和某字符串的出现数量。
wa了两次,写题时犯得错误有:
1.使用样例检查出来向下搜索字符串时没有减去字符串本身出现的数量,比如样例中aabc 0 3,不计重复的情况下向下搜索还要多减一下a和aa分别出现的1次;
2.第一次wa检查出来val没有在建自动机的时候赋值,所以T=1的时候val和g都=0;
3.第二次wa检查半天自己随便打了个字符串跑一下发现数量不对,然后找了半天最后看出来是自己的ac自动机写错了一个len的赋值,太zz了orz。
还是要熟悉一下自动机的写法。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
int siz,T;
long long K;
char ch[maxn*]={};
int cnt[maxn*]={};//按照深度排序
int b[maxn*]={};//排序后每个的rk
long long val[maxn*]={};//每个状态出现的数目
long long g[maxn*]={};//每个状态及其所有以其为前缀后继的数目
struct nod{
int sig[];
int f,len;
void cle(){f=-;len=;memset(sig,-,sizeof(sig));}
}t[maxn*];
int las=,tot=;
void add(int z){
int x=++tot; t[x].cle();
t[x].len=t[las].len+;
val[x]=;
int i=las;
for(;i!=-&&t[i].sig[z]==-;i=t[i].f)
t[i].sig[z]=x;
if(i==-)t[x].f=;
else{
int p=t[i].sig[z];
if(t[p].len==t[i].len+)t[x].f=p;
else{
int y=++tot;t[y].cle();
t[y]=t[p];
t[y].len=t[i].len+;
t[x].f=t[p].f=y;
for(;i!=-&&t[i].sig[z]==p;i=t[i].f)
t[i].sig[z]=y;
}
}las=x;
}
void pai(){
for(int i=;i<=tot;i++)++cnt[t[i].len];
for(int i=;i<=siz;i++)if(i)cnt[i]+=cnt[i-];
for(int i=;i<=tot;i++)b[cnt[t[i].len]--]=i;
}
void doit(){
for(int i=tot+;i;i--){
int z=b[i];
if(T&&z)val[t[z].f]+=val[z];
else val[z]=;
}
val[]=;
for(int i=tot+;i;i--){
int z=b[i];
g[z]=val[z];
for(int j=;j<;j++)if(t[z].sig[j]!=-)g[z]+=g[t[z].sig[j]];
}
}
void getit(int x,long long k){
if(k<)return;
long long sum=;
for(int i=;i<;i++){
if(!t[x].sig[i])continue;
if(sum<k&&sum+g[t[x].sig[i]]>=k){
printf("%c",'a'+i);
getit(t[x].sig[i],k-sum-val[t[x].sig[i]]);
break;
}sum+=g[t[x].sig[i]];
}
}
int main(){
t[].cle();
scanf("%s",ch);siz=strlen(ch);
for(int i=;i<siz;i++)add(int(ch[i]-'a'));
pai();
scanf("%d%lld",&T,&K);
doit();
if(K>g[])printf("-1\n");
else getit(,(long long)K);
return ;
}
BZOJ 3998: [TJOI2015]弦论 后缀自动机 后缀自动机求第k小子串的更多相关文章
- BZOJ 3998 TJOI2015 弦论 后缀自动机+DAG上的dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3998 题意概述:对于一个给定长度为N的字符串,求它的第K小子串是什么,T为0则表示不同位置 ...
- BZOJ 3998: [TJOI2015]弦论 [后缀自动机 DP]
3998: [TJOI2015]弦论 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2152 Solved: 716[Submit][Status] ...
- BZOJ 3998 [TJOI2015]弦论 ——后缀自动机
直接构建后缀自动机. 然后. 然后只需要再后缀自动机的go树上类似二分的方法进行查找即可,实际上是“26分”. 然后遇到了处理right集合的问题,然后觉得在go和parent树上上传都是可以的,毕竟 ...
- bzoj 3998 [TJOI2015]弦论——后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3998 相同子串算多个的话,先求好 right ,然后求一个 sm 表示走到这个点之后有几种走 ...
- BZOJ.3998.[TJOI2015]弦论(后缀自动机)
题目链接 \(Description\) 给定字符串S,求其第K小子串.(若T=0,不同位置的相同子串算1个:否则算作多个) \(Solution\) 建SAM,处理出对于每个节点,它和它的所有后继包 ...
- BZOJ 3998: [TJOI2015]弦论(后缀自动机)
传送门 解题思路 \(T=0\)时就和SP7258一样,\(T=1\)时其实也差不多,只不过要把每个点原来是\(1\)的权值改为\(Right\)集合的大小. 代码 #include<iostr ...
- ●BZOJ 3998 [TJOI2015]弦论
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3998题解: 后缀自动机. 当T=0时, 由于在后缀自动机上沿着trans转移,每个串都是互不 ...
- bzoj 3998: [TJOI2015]弦论【SA+二分||SAM】
SA的话t==0直接预处理出每个后缀的不同串贡献二分即可,然后t==1就按字典序枚举后缀,然后跳右端点计算和当前后缀的前缀相同的子串个数,直到第k个 不过bzoj上会T #include<ios ...
- bzoj 3998: [TJOI2015]弦论
Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...
随机推荐
- 20155117王震宇 2006-2007-2 《Java程序设计》第二周学习总结
学号 2006-2007-2 <Java程序设计>第X周学习总结 教材学习内容总结 学习一门语言首先要熟悉基础的语法,注意不要和之前学过的语言知识混淆. java严格区分大小写. 教材学习 ...
- 黑色的企业网站后台管理模板html源码
链接:http://pan.baidu.com/s/1kUMqDU3 密码:83xt
- 将neuroph导入到Eclipse中
1.下载neuroph 网址:http://neuroph.sourceforge.net/ 本人选择的是2.8版本 2.解压文件 本人解压至:D:\neuroph-2.8 3.neuroph jar ...
- MySQL join 用法
select column1, column2 from TABLE1 join TABLE2 on 条件 # select * from table1 join table2; #两个表合成一个se ...
- ubuntu之一些安装配置的坑
前言 本博客记录自己使用ubuntu的一些错误和坑. ubuntu不支持yum下载安装机制 命令 sudo apt install yum 是可以安装yum的,但安装好后执行: $ yum insta ...
- Linux命令学习手册-route命令
route [-CFvnee] route [-v] [-A family] add [-net|-host] target [netmask Nm] [gw Gw] [metric N] [mss ...
- c/c++中static用法总结
static的作用主要有两种: 第一个作用是限定作用域:第二个作用是保持变量内容持久化: c语言中static的用法: 1.全局静态变量: 用法:在全局变量前加上关键字static,全局变量就定义成一 ...
- Python+Selenium 自动化实现实例-模块化调用
public 目录存一些公共模块,供用例调用.login.py 内容如下: # coding=utf-8 import time # login def login(driver): driver.f ...
- Qt 下载列表地址
每次下载Qt总是找好长时间,收藏一下地址 Qt 下载列表地址 https://www.qt.io/download-open-source/#section-9 教育网镜像下载 http://mirr ...
- vuejs学习——vue+vuex+vue-router项目搭建(三)
前言 vuejs学习——vue+vuex+vue-router项目搭建(一) vuejs学习——vue+vuex+vue-router项目搭建(二) 为什么用vuex:组件之间的作用域独立,而组件之间 ...