P4465 [国家集训队] JZPSTR
P4465 [国家集训队] JZPSTR
更好的阅读体验
莪怺逺禧歡仳特噻特。
5k 爷很早以前就让我写这个 bitset 水题。
在一个字符串中插入字符串,删除字符串,查询给定子串出现次数。
插入,删除,字符集大小小,bitset!
关于 bitset 匹配:
我们对于每一种字符 bitset
对于一个字符串 bitset
我们遍历 bitset 中是右移)。
最后得到的就是所有起始位置,匹配的时间复杂度是
回到这道题上,查询操作已经迎刃而解,插入删除怎么做?多运用位运算思想。
我们定义一个全 bitest k。
提取出 b&(k<<x),那同理提取出 b&(~(k<<x))。
那么对于每个
对于插入操作,提取出
对于删除操作,提取出
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<bitset>
using namespace std;
const int MAXN=1e6+10;
int q,n;bitset <MAXN> b[10],ans,k,r;
int main()
{
#ifdef ONLINE_JUDGE
cin.tie(0),cout.tie(0);
ios::sync_with_stdio(0);
#endif
cin>>q;
while(q--)
{
int opt;cin>>opt;k.set();
if(!opt)
{
int x;string t;cin>>x>>t;r=~(k<<x);
for(register int i=0;i<=9;++i)
b[i]=((b[i]&(k<<x))<<t.size())|(b[i]&r);
for(register int i=0;i<t.size();++i)
b[t[i]-'0'].set(x+i);
}
if(opt==1)
{
int x,y;cin>>x>>y;r=~(k<<x);
for(register int i=0;i<=9;++i)
b[i]=((b[i]&(k<<y))>>(y-x))|(b[i]&r);
}
if(opt==2)
{
int x,y;string t;cin>>x>>y>>t;ans.set();
for(register int i=0;i<t.size();++i) ans&=b[t[i]-'0']>>i;
if(y-x<t.size()) cout<<"0\n";
else cout<<(ans>>x).count()-(ans>>y-t.size()+1).count()<<'\n';
}
}
return 0;
}