BZOJ3998 TJOI2015 弦论 【后缀自动机】【贪心】
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
思路
看这道题是处理K小字串,果断上后缀自动机啊
然后考虑怎么统计答案
如果T是0,那么可以每一个节点的大小是1,否则大小是right集合大小
然后toposort之后反向DP出经过这条转移边可以有多少种字串
然后就可以直接贪心了
toposort的数组也要开串长两倍啊啊啊
#include<bits/stdc++.h>
using namespace std;
#define fu(a,b,c) for(int a=b;a<=c;++a)
#define fd(a,b,c) for(int a=b;a>=c;--a)
const int CHARSET_SIZE=26;
#define N 500010
struct Node{
int ch[CHARSET_SIZE],prt;
int maxl,right;
Node(int maxl=0,int right=0):ch(),prt(0),maxl(maxl),right(right){}
}t[N<<1];
int root,last,cur;
int topo[N<<1],buc[N];
int newnode(int maxl=0,int right=0){t[++cur]=Node(maxl,right);return cur;}
void init(){cur=0;root=last=newnode();}
void extend(int c){
int u=newnode(t[last].maxl+1,1),v=last;
for(;v&&!t[v].ch[c];v=t[v].prt)t[v].ch[c]=u;
if(!v){t[u].prt=root;}
else if(t[t[v].ch[c]].maxl==t[v].maxl+1){
t[u].prt=t[v].ch[c];
}else{
int n=newnode(t[v].maxl+1,0),o=t[v].ch[c];
memcpy(t[n].ch,t[o].ch,sizeof(t[o].ch));
t[n].prt=t[o].prt;
t[o].prt=t[u].prt=n;
for(;v&&t[v].ch[c]==o;v=t[v].prt)t[v].ch[c]=n;
}
last=u;
}
void toposort(){
int maxv=0;
fu(i,1,cur){
++buc[t[i].maxl];
maxv=max(maxv,t[i].maxl);
}
fu(i,1,maxv)buc[i]+=buc[i-1];
fu(i,1,cur)topo[buc[t[i].maxl]--]=i;
fu(i,1,maxv)buc[i]=0;
}
void cal_right(){
toposort();
fd(i,cur,1){
int p=topo[i];
t[t[p].prt].right+=t[p].right;
}
}
char c[N],ans[N];
int T,K,dp[N<<1];
int main(){
scanf("%s",c+1);
scanf("%d%d",&T,&K);
int len=strlen(c+1);
init();
fu(i,1,len)extend(c[i]-'a');
cal_right();
fu(i,2,cur)dp[i]=T?t[i].right:1;
fd(i,cur,1)
fu(j,0,25)
dp[topo[i]]+=dp[t[topo[i]].ch[j]];
if(K>dp[1]){printf("-1");return 0;}
int now=1,siz=0;
while(1){
int tmp=T?t[now].right:1;
if(now==1)tmp=0;
if(K<=tmp)break;
K-=tmp;
fu(i,0,25)if(t[now].ch[i]){
int v=t[now].ch[i];
if(dp[v]>=K){ans[++siz]=i+'a';now=v;break;}
else K-=dp[v];
}
}
fu(i,1,siz)printf("%c",ans[i]);
return 0;
}
BZOJ3998 TJOI2015 弦论 【后缀自动机】【贪心】的更多相关文章
- [bzoj3998][TJOI2015]弦论-后缀自动机
Brief Description 给定一个字符串, 您需要求出他的严格k小子串或非严格k小子串. Algorithm Design 考察使用后缀自动机. 首先原串建SAM, 然后如果考察每个状态代表 ...
- 【BZOJ3998】[TJOI2015]弦论 后缀自动机
[BZOJ3998][TJOI2015]弦论 Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T ...
- 【bzoj3998】[TJOI2015]弦论 后缀自动机+dp
题目描述 对于一个给定长度为N的字符串,求它的第K小子串是什么. 输入 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个.T=1则表示不同位置 ...
- 【BZOJ-3998】弦论 后缀自动机
3998: [TJOI2015]弦论 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2018 Solved: 662[Submit][Status] ...
- BZOJ 3998: [TJOI2015]弦论 [后缀自动机 DP]
3998: [TJOI2015]弦论 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2152 Solved: 716[Submit][Status] ...
- BZOJ 3998: [TJOI2015]弦论 后缀自动机 后缀自动机求第k小子串
http://www.lydsy.com/JudgeOnline/problem.php?id=3998 后缀自动机应用的一个模板?需要对len进行一个排序之后再统计每个出现的数量,维护的是以该字符串 ...
- BZOJ 3998 TJOI2015 弦论 后缀自动机+DAG上的dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3998 题意概述:对于一个给定长度为N的字符串,求它的第K小子串是什么,T为0则表示不同位置 ...
- BZOJ 3998 [TJOI2015]弦论 ——后缀自动机
直接构建后缀自动机. 然后. 然后只需要再后缀自动机的go树上类似二分的方法进行查找即可,实际上是“26分”. 然后遇到了处理right集合的问题,然后觉得在go和parent树上上传都是可以的,毕竟 ...
- [TJOI2015]弦论(后缀自动机)
/* 一道在树上乱搞的题目 建立出parent树来, 然后就能搞出每个节点往后能扩展出几个串, 至于位置不同算同一个的话就强制让right集合大小为1即可 然后在树上类比权值线段树找第k大26分统计一 ...
- BZOJ.3998.[TJOI2015]弦论(后缀自动机)
题目链接 \(Description\) 给定字符串S,求其第K小子串.(若T=0,不同位置的相同子串算1个:否则算作多个) \(Solution\) 建SAM,处理出对于每个节点,它和它的所有后继包 ...
随机推荐
- php中点击下载按钮后待下载文件被清空
在php中设置了文件下载,下载按钮使用表单的方式来提交 <form method="post" class="form-inline" role=&quo ...
- Lubuntu系统中java,tomcat的环境搭建(virtualbox中)
一.安装Lubuntu系统 这一步没什么说的,到官网下载镜像,在virtualbox中安装即可安装时就已经可以选择安装源,当然,选中国的设置环装网络,可将该虚拟机设立为网络上的独立IP,和物理机间可以 ...
- git rm -r --cache命令 及 git .gitignore 文件
git 的 .gitignore 文件的作用是在代码提交时自动忽略一个文件.不将其纳入版本控制系统. 比如.一般我们会忽略IDE自动生成的配置文件等. 如果一个你要忽略的文件已经纳入到了git ,也 ...
- Shell date 命令详解
格式: date [选项] ... [+格式] 选项说明: -d ,--date=字符串 显示指定字符串所描述的时间 格式说明: 例子1: #!/bin/bash ##. 获取当前系统时间 YYYY- ...
- ASP.NET 4.5 MVC 4 无法运行在Windows2008的IIS7.0上显示404的解决方案
需要在web.config下加上这个 <system.webServer> <modules runAllManagedModulesForAllRequests="tru ...
- Java集合详解8:Java的集合类细节精讲
Java集合详解8:Java集合类细节精讲 今天我们来探索一下Java集合类中的一些技术细节.主要是对一些比较容易被遗漏和误解的知识点做一些讲解和补充.可能不全面,还请谅解. 本文参考:http:// ...
- IOS-网络(网页开发-UIWebView,HTML,CSS,JavaScript,OC和JS代码互调)
一.网页基础 // // ViewController.m // IOS_0218_网页开发1 // // Created by ma c on 16/2/18. // Copyright © 201 ...
- vue-router防跳墙控制
vue-router防跳墙控制 因为在实际开发中,从自己的角度来看,发现可以通过地址栏输入地址,便可以进入本没有权限的网页.而我们一般只是操作登录页面,其他页面很少考虑,此刻特来尝试解决一下 基于vu ...
- Java复习7.输入输出流
Java复习7.输入输出流 20131005 前言: Java中涉及数据的读写,都是基于流的,这一块的知识相当重要,而且在Java中的数据,char字符是16bit的,所以存在字节流和字符流的区别.如 ...
- 快速切题 poj 1002 487-3279 按规则处理 模拟 难度:0
487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 247781 Accepted: 44015 Descr ...