首页 > 其他分享 >CF963D Frequency of String

CF963D Frequency of String

时间:2023-10-08 09:58:53浏览次数:33  
标签:CF963D int color Frequency bitset ans include red String

Frequency of String

莪怺逺禧歡仳特噻特。

记每次询问中的字符串为 \(t_i\)。约定字符串下标从 \(1\) 开始。

发现 \(\sum |t_i|\) 与 \(|s|\) 和 \(q\) 同阶,考虑使用 bitset 进行字符串匹配。

我们对于每一种字符 \(c\) 开一个 bitset \(b_c\),然后预处理将 \(b_{s_i}\) 的第 \(i\) 位设置为 \(1\),也就是对于每种字符记录出它在 \(s\) 中所有的出现位置。

对于一个字符串 \(t\),与 \(s\) 进行字符串匹配。我们开一个记录答案的 bitset \(ans\),意义是每一个为 \(1\) 的位都是 \(t\) 在 \(s\) 中的起始位置(有些写法是结束位置)。初始时将 \(ans\) 每一位都赋值为 \(1\)。

\(s:abcdabacd\)

\(t:abcd\)

\(ans:1\ 1\ 1\ 1\ 1\ 1\ 1\ 1\ 1\)

我们遍历 \(t\) 的每一位,使 \(ans\gets ans\operatorname{bitand} (b_{y_i}\operatorname{>>}(i-1))\)(字符串向左移,但是 bitset 中是右移)。

\(s:\ \ \ \ {\color{red} a}\ b\ c\ d\ {\color{red} a}\ b\ {\color{red} a}\ c\ d\)

\(ans:1\ 0\ 0\ 0\ 1\ 0\ 1\ 0\ 0\)

\(s:\ \ \ \ {\color{red} b}\ c\ d\ a\ {\color{red} b}\ a\ c\ d\)

\(ans:1\ 0\ 0\ 0\ 1\ 0\ 0\ 0\ 0\)

$\cdots $

最后得到的就是所有起始位置,匹配的时间复杂度是 \(O(\dfrac{|s|\sum |t_i|}{\omega})\)。

考虑怎样快速统计答案,直接遍历显然单次 \(O(|s|)\),可以通过 bitset 的函数 _Find_first()_Find_next(x) 找到 bitset 中第一个为 \(1\) 的位置和 \(x\) 之后第一个为 \(1\) 的位置。就可以直接遍历所有为 \(1\) 的位置。直接统计就可以了。

为什么这样的时间复杂度是正确的,因为 \(t_i\) 互不相同,所以所有 \(t_i\) 在 \(s\) 中总出现次数不超过 \(|s|\sqrt{\sum |t_i|}\)。所以这里时间复杂度是 \(O(|s|\sqrt{\sum |t_i|})\)。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<bitset>
using namespace std;
const int MAXN=1e5+10;
string s,t;int n,q,k,ANS;
bitset <MAXN> b[300],ans;
int main()
{
#ifdef ONLINE_JUDGE
    cin.tie(0),cout.tie(0);
    ios::sync_with_stdio(0);
#endif
    cin>>s>>q;n=s.size();s=' '+s;
    for(register int i=1;i<=n;++i) b[s[i]].set(i);
    for(register int i=1;i<=q;++i)
    {
        cin>>k>>t;ans.set(),ANS=MAXN;
        for(register int i=0;i<t.size();++i) ans&=b[t[i]]>>i;
        int l=ans._Find_first(),r=l;
        for(register int i=1;r<=n&&i<k;++i) r=ans._Find_next(r);
        while(r<=n)
        {
            ANS=min(ANS,r+(int)t.size()-l);
            l=ans._Find_next(l),r=ans._Find_next(r);
        }
        cout<<(ANS==MAXN?-1:ANS)<<'\n';
    }
    return 0;
}

标签:CF963D,int,color,Frequency,bitset,ans,include,red,String
From: https://www.cnblogs.com/int-R/p/CF963D.html

相关文章

  • Java中String字符串的用法
    1.类String是java.lang包下的类,所以不需要导包就可以直接使用。String类代表字符串。Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现。  字符串是常量;它们的值在创建之后不能更改。StringBuffer(字符串缓冲区)支持可变的字符串。因为String对象是不可变的,所......
  • Java中的String
    在Java中,字符串(String)是一种常见的数据类型,用于表示一系列字符。String类是Java中的一个内置类,提供了许多有用J的方法,使得字符串的处理变得更加方便和高效。本文将介绍Java中String类的一些基本用法和常见应用场景。创建字符串在Java中,可以使用双引号("")或单引号('')来创建字符......
  • xpath 处理自增的id manage11 使用表达式 //*[starts-with(@id, "manage") and
      //*[starts-with(@id,"manage")andnumber(substring-after(@id,"manage"))=11] 1.使用starts-with()函数选择以"manage"开头的所有元素,2.使用substring-after()函数获取ID中"manage"后面的部分。3.使用number()函数将这部分转换为数字,4.使用逻辑运算符and来判断......
  • 代码源:a-good string(CF1385D,分支)
    传送点击查看代码#include<bits/stdc++.h>usingnamespacestd;chars[131080];int_solve(intL,intR,charx){ if(L==R)returns[L]!=x; intM=L+(R-L)/2; intt1=0,t2=0; for(inti=L;i<=M;++i)if(s[i]!=x)t1++; for(inti=M+1;i<=R;++i)if(s[i]!=x)......
  • 包装类、StringBuilder、StringBuffer、StringJoiner
    1、怎么将Int类型的包装成对象使用Integer的valueOf方法Integera2==Integer.valueOf(12);2、自动装箱机制(可以自动把基本数据类型的数据转换成对象)Integera3=12;自动拆箱机制(可以自动把包装类型的对象转换成对应的基本数据类型)inta4=a3;......
  • to String、equal、clone() 方法
     字符串表示形式如图:1、toString存在是为了让子类去重写,以返回对象的内容(a、鼠标右键点生成可以找到toStringb、直接输入toS,按回车,接续按回车,就重写好了)2、equals默认判断两个对象的地址是否相等,重写是为了比较对象的内容是否一样3、(了解)clone()方法(protected修饰):当......
  • 在C#中,String和string有什么区别?
    内容来自DOChttps://q.houxu6.top/?s=在C#中,String和string有什么区别?这两种类型之间有什么区别,我应该使用哪一个?strings="Helloworld!";Strings="Helloworld!";字符串(string)是C#中System.String的别名。因此,从技术上讲,它们之间没有区别。就像整数(int)和Syst......
  • MaSuRCA 软件安装 swig/perl5/swig_wrap.cpp:342:20: fatal error: string.h: No such
     001、问题MaSuRCA软件安装swig/perl5/swig_wrap.cpp:342:20:fatalerror:string.h:Nosuchfileordirectory  002、原因,当前环境处于conda的base环境,可能是函数库调用混乱。  003、解决方法,推出conda基础环境安装(base)[b20223040323@admin1MaSuRCA-4......
  • C error:deprecated conversion from string constant to 'char*' [-Wwrite-strings]
    问题描述解决C++中[Warning]deprecatedconversionfromstringconstantto'char*'[-Wwrite-strings]char*string="aaabbbcc";//warning的原因是字符串常量存放在const内存区...原因主程序初始化字符串,是字符串常量,该字符串的内存分配在全局的const内存区。......
  • JavaSE(07) - API -String字符串
    JavaSE(07)-API-String字符串p96API和API帮助文档p97String概述java.lang.String类代表字符串,java程序中的所有字符串文字(例如"abc")都是此类的对象.注意点:字符串的内容是不会发生改变的,他的对象在创建后不能被更改.p89String的构造方法代码实现和内存分析......