CF963D Frequency of String 题解
需要发现一个重要性质:对于
证明考虑把模式串按长度分类,那么对于长度为
所以我们可以对于每个模式串 bitset
维护 endpos 集合即可。即对于字符集中的每一个字母用 bitset
维护出它在 bitset
,依次处理模式串中的字符,通过简单的左移或右移减小这个 bitset
的规模,从而得到最后模式串的所有 endpos,复杂度是
这样我们获得了一个用 bitset
维护的 endpos 集合,那么直接遍历 bitset
中的每一个 1,对于连续的 _Find_first()
以及 _Find_next(x)
,其作用分别为返回 bitset
中的第一个 1 的位置(以数值表示)以及当前的下一个 1 的位置,这样就可以在
总复杂度
代码
const int N=2e5+50;
int n,m,q,k;
vector<int> vec;
bitset<N> bit[26],cur;
char s[N],t[N];
int main(void)
{
scanf("%s",s+1),n=strlen(s+1),q=read();
fr(i,0,25) bit[i].reset();
fr(i,1,n) bit[s[i]-'a'].flip(i);
fr(i,1,q)
{
k=read(),scanf("%s",t+1),m=strlen(t+1),cur.set(),vec.clear();
fr(j,1,m) cur&=(bit[t[j]-'a']<<(m-j));
for(int pos=cur._Find_first();pos!=N;pos=cur._Find_next(pos)) vec.emplace_back(pos);
int sz=vec.size(),ans=inf;
fr(j,k-1,sz-1) ans=min(ans,vec[j]-vec[j-k+1]+m);
(ans==inf)?writeln(-1):writeln(ans);
}
return 0;
}