解题:TJOI 2015 弦论
好像是个经典问题,然而我没做过
建SAM,然后经过每个节点的子串数目就可以求了,多个相同子串算一个的话就把所有siz都搞成$1$,否则就是$right$集合的大小,然后就是常见的递推
求第$k$小是从根节点出发按字典序沿着trans往下走,每次输出对应的字符然后扣掉对应的数量
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=;
int fth[M],trs[M][],len[M],siz[M];
int rnk[M],bkt[M]; long long sum[M];
int typ,kth,lth,lst,tot;
char str[N];
void Insert(int ch)
{
int nde=lst,newn=++tot; lst=newn;
siz[newn]=,len[newn]=len[nde]+;
while(nde&&!trs[nde][ch])
trs[nde][ch]=newn,nde=fth[nde];
if(!nde)
fth[newn]=;
else
{
int tran=trs[nde][ch];
if(len[tran]==len[nde]+)
fth[newn]=tran;
else
{
int rnde=++tot; len[rnde]=len[nde]+;
for(int i=;i<=;i++) trs[rnde][i]=trs[tran][i];
fth[rnde]=fth[tran],fth[tran]=fth[newn]=rnde;
while(nde&&trs[nde][ch]==tran)
trs[nde][ch]=rnde,nde=fth[nde];
}
}
}
int main()
{
register int i,j,k;
scanf("%s%d%d",str+,&typ,&kth);
lth=strlen(str+),lst=tot=;
for(i=;i<=lth;i++) Insert(str[i]-'a');
for(i=;i<=tot;i++) bkt[len[i]]++;
for(i=;i<=lth;i++) bkt[i]+=bkt[i-];
for(i=;i<=tot;i++) rnk[bkt[len[i]]--]=i;
for(i=tot;i;i--)
j=rnk[i],typ?siz[fth[j]]+=siz[j]:siz[j]=;
siz[]=;
for(i=tot;i;i--)
{
j=rnk[i],sum[j]=siz[j];
for(k=;k<=;k++)
if(trs[j][k]) sum[j]+=sum[trs[j][k]];
}
if(kth>sum[]) printf("-1");
else
{
int nde=;
while(kth-siz[nde]>)
{
kth-=siz[nde];
for(i=;i<=&&kth>sum[trs[nde][i]];i++)
kth-=sum[trs[nde][i]];
nde=trs[nde][i],printf("%c",i+'a');
}
}
return ;
}
解题:TJOI 2015 弦论的更多相关文章
- BZOJ 3998 [TJOI 2015] 弦论 解题报告
这是一道后缀自动机经典题目. 对于 $t=0$ 的情况:每个节点都代表一个子串,所以我们给每个节点的 $Size$ 都记为 $1$, 对于 $t=1$ 的情况:我们只给 $last$ 节点的 $Siz ...
- BZOJ 3997 [TJOI 2015 组合数学] 解题报告
这个题我脑洞了一个结论: 首先,我们定义满足以下条件的路径为“从右上到左下的路径”: 对于路径上任何不相同的两个点 $(x_1, y_1)$,$(x_2, y_2)$,都有: $x_1\neq x_2 ...
- BZOJ 3996 [TJOI 2015] 线性代数 解题报告
首先,我们可以得到: $$D = \sum_{i=1}^{n}\sum_{j=1}^{n}a_i\times a_j\times b_{i,j} - \sum_{i=1}^{n}a_i\times c ...
- 解题:TJOI 2015 组合数学
题面 通过这个题理解了一下反链的概念,更新在图论知识点里了 每个点向右和下连边可以建出一张图,这个题事实上是让我们求图的最小链覆盖.Dilworth定理告诉我们,最小链覆盖等于最长反链(反链:DAG中 ...
- TJOI 2015 概率论(生成函数)
题意 求一棵随机生成的有根二叉树(节点无标号,各种不同构的情况随机出现)叶子结点个数的期望. 思路 用生成函数做是个好题. 我们考虑设 \(n\) 个节点,所有不同构二叉树叶子结点的总和为 ...
- 后缀自动机(SAM)奶妈式教程
后缀自动机(SAM) 为了方便,我们做出如下约定: "后缀自动机" (Suffix Automaton) 在后文中简称为 SAM . 记 \(|S|\) 为字符串 \(S\) 的长 ...
- 2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)
官方解题报告:http://bestcoder.hdu.edu.cn/blog/2015-multi-university-training-contest-6-solutions-by-zju/ 表 ...
- [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告
[NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...
- 洛谷 P3975 [TJOI2015]弦论 解题报告
P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...
随机推荐
- Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)---->第4节: recycler中获取对象
Netty源码分析第八章: 高性能工具类FastThreadLocal和Recycler 第四节: recycler中获取对象 这一小节剖析如何从对象回收站中获取对象: 我们回顾上一小节demo的ma ...
- Ruby知识点一:方法
1.实例方法 接收者是对象本身的方法 2.类方法 接收者是类本身的方法,调用类方法时,可以使用::或者.两个符号. 类名.方法名 类名::方法名 3.函数式方法 没有接收者(接收者省略而已)的方法 4 ...
- JDK动态代理的简单理解
转载:http://www.cnblogs.com/luotaoyeah/p/3778183.html 动态代理 代理模式是 Java 中的常用设计模式,代理类通过调用被代理类的相关方法,提供预处理. ...
- ModelAndView在页面上取值时value="{contextConfigLocation=<NONE>}"
后台: mv.getModel().put("initParam", 1); 页面: <input type="hidden" id="init ...
- Last Daily Scrum (2015/11/9)
今晚我们终于完成了新版本的爬虫工作,可以替换掉之前部署在服务器上的那个爬虫了.由于周末大家各种原因导致了我们迭代一的截止日没有完成所有任务,所以今天晚上大家加班加点终于把这一迭代的爬虫项目完成了. 成 ...
- web05-CounterServlet
电影网站:www.aikan66.com 项目网站:www.aikan66.com 游戏网站:www.aikan66.com 图片网站:www.aikan66.com 书籍网站:www.aikan66 ...
- Beta后续感想/吐槽
感想 磨人的软工实践终于结束了 艰难的度过了一学期,还是写点什么纪念一下吧. 大一大二的时候就听说软工实践是魔鬼般的锻炼,于是当年不知天高地厚的我是很期待的,终于,我大三了. 后来,我长大了. alp ...
- Beta Scrum Day 1 — 听说
听说
- HttpContext.Current.Server.MapPath("/") 未将对象设置到对象的实例异常。
多线程中的System.Web.HttpContext.Current.Server.MapPath("/") 多线程中Server.MapPath会失效... 网上找到几种解决方 ...
- angularJS1笔记-(7)-控制器的合理使用(显示和隐式的依赖注入)
AngularJS依赖注入 1.隐式注入:不需要开发人员干预,angularJS自动根据参数的名称识别和注入数据 app.controller("myCtrl".function( ...