找回密码 jzoj 4025 后缀自动机

题目

Kevin是一个热爱字符串的小孩。有一天,他把自己的微信登录密码给忘记了,万般无奈之下只好点“找回密码”。
这时候,网页上出现了当初设定的密保问题:在字符串st中,有若干个内容不同的子串,请问其中字典序第k小的子串是什么?
很可惜的是,Kevin现在已经不会写程序了,所以,他找到了睿智的你来帮忙。

分析

对串创建SAM,然后,拓扑一下,算出每个状态,如果继续往后边走,能够生成多少种不同的字符串。然后每次查询的时候,就按照字典顺序来看,比如到达某个点S,先看’a’儿子能造出多少个字符,如果很少,那么我们下一个字符肯定不走‘a’,那么我们继续看’b’,看一下’a’和‘b’共能造出多少个字符,如果多了,那就选‘b’,如果还不够,那就继续看‘a’、‘b’、‘c’,在这个DAG上边爬一爬就行了。具体细节看一下代码。

这是三道题中我唯一会做的题,我果然是太弱了。。。

你可能感兴趣的:(c++,后缀自动机,jzoj)