hfccccccccccccc

  :: :: 博问 :: 闪存 :: :: :: :: 管理 ::

https://codeforces.com/problemset/problem/123/D

题目大意

给一个字符串 \(s\),每次询问一个字符串 \(m_i\) 和一个正整数 \(k_i\),问 \(s\) 中包含了 \(k_i\)\(m_i\) 的子串的长度最小值。

每次询问的 \(m_i\) 两两不同。

解法

考虑一下询问的字符串的出现次数。

如果有多个长度相同的 \(m_i\),那么他们的最多出现次数之和是 \(O(|s|)\) 的。因此考虑最坏的情况,即询问的 \(m_i\) 长度两两不同。

\(M = \sum{|m_i|}\),那么最多只有 \(\sqrt{M}\) 种不同的长度,因此所有 \(m_i\) 的出现次数之和为 \(O(|s|\sqrt{M})\),直接暴力找到所有出现位置就好做了。

posted on 2019-01-04 15:22  hfccccccccccccc  阅读(402)  评论(0编辑  收藏  举报