题意:给你一个循环串(首尾相接),求出使其字典序最小的起始位置。
后缀自动机(SAM)的第一道题。
看后缀自动机有关的东西看了很久,差不多明白了一些。
这道题其实本来有更加简单的暴力做法,不过就全当练习SAM了。
首先将原串S扩展至两倍SS,这是循环串的惯用套路。
接着将SAM增量构造出来,由于SAM包含了原串的所有子串,所以在SAM上,每次沿着字典序最小的边走,走$|S|$次,到达节点u一定包含要找的字典序最小的串。
那么如何将其提取出来?也就是,如何在u表示的众多串中,找到那个串,并且知道其在原串中的起始位置呢?
其实并不用找到那个串。注意到u表示的最长的串一定是从原串的开头到我们要找的串的末尾的。而根据SAM的性质,我们要找的串一定是最长串的后缀,且长度为n。于是$Max[u]-n+1$便是答案了。
要注意一点:SAM中是否有某个节点是用其对应下标是否为0来判断的。所以SAM的start节点不能设为0。为了方便,设为1即可。