这一题很巧妙啊!
首先题目给的式子就很吓人,但仔细分析我们就发现:
其实就是求:
这个只要把式子展开就能发现了。为啥能想到这?因为题目就是问本质不同的字串,我们肯定尽可能往这里构造(有后缀自动机可以解决这个问题)
好了到这里我们就可n^2暴力做这题了。——把n个后缀离线插入到字典树中,然后BFS建立SAM,跑一下就行,其实就是广义后缀自动机。
但显然AC不了。
我们还需要优化。看题目字符集大小K=10,
他这个条件肯定是有用的(除非出题人毒瘤,故意坑你,一般正常情况不会这样搞得,反正我没做过题目条件故意给低的题目)
我们把样例2的后缀写在纸上,发现暴力插入会有很多浪费的操作。
比如:
ddddd
bccd
ccd
ad
d
显然每个后缀的最后一个d只需要一次插入,而我们执行了5次,只有一次是在字典树上有效的。
后缀bccd,与ccd建立字典树时 ccd都是重复的。又浪费了3次。
我们很容易想到:字典树上的字符集大小是On级别的,暴力插入会浪费很多次数。
于是自然而然就想到倒着扫描字符串,然后建立字典树。
倒着扫描字符串,每次插入当前位置到n的后缀 这个字符串(这个字符串我们只需要插入在前面第一个大于等于当前字符位置后若干个当前字符即可。) 第一个大于等于当前字符 的字符 的前面的字符,