题面
解法
解法全靠yy……
- 显然我们可以先构造出后缀数组。我们令 l e n [ i ] = m a x ( h e i g h t [ r n k [ i ] ] , h e i g h t [ r n k [ i ] + 1 ] ) len[i]=max(height[rnk[i]],height[rnk[i]+1]) len[i]=max(height[rnk[i]],height[rnk[i]+1]),表示从 i i i开始长度超过 l e n [ i ] len[i] len[i]的所有子串在整个串中只出现过一次。
- 那么我们考虑如何对于每一个位置 i i i求解答案。显然,如果确定了这个字符串的开头 j j j,那么整个字符串长度的最小值也自然可以确定,为 m a x ( j + l e n [ j ] , i ) − j + 1 max(j+len[j],i)-j+1 max(j+len[j],i)−j+1。那么 a n s [ i ] = m i n { m a x ( j + l e n [ j ] , i ) − j + 1 } ans[i]=min\{max(j+len[j],i)-j+1\} ans[i]=min{ max(j+len[j],i)−j+1}。如果直接暴力做复杂度是 O ( n 2 ) O(n^2) O(n2