HDU - 4821 String
给定字符串 \(S\)。求有多少长 \(M \times L\) 的子串,使得将其划分成 \(M\) 个长度为 \(L\) 的字符串 \(S_1,S_2,\dots S_M\) 互不相同。
\(1 \le M \times L \le |S| \le 10^5\)。
从 \(0\) 起下标。
显然这些字符串的起始位置在模 \(L\) 意义下相同。不妨枚举这个值 \(r \in [0, L)\)。
依旧是说这些字符串的起始位置必须是 \(r + kL\),且 \(k\) 连续。
不妨求出 \(h_k = \operatorname{Hash}(S[r+kL,r+(k+1)L-1])\)。于是问题变成了,求 \(h\) 中有多少长 \(M\) 的区间,满足元素互不相同。
直接用个桶扫一遍就做完了呀。
但是我计 \(p_i\) 表示 \(i\) 之前最后一个和 \(h_i\) 相同的位置。然后 \([l,l+M-1]\) 合法等价于 \(p\) 的区间最大值 \(< l\)。于是单调队列维护区间最小值。