练习bitset第一题。。。
思路:
先用一个bitset的二维数组保存每个文本串字母的位置信息,在把模板串中每个字母与文本串的字母进行比较,但这样无法统计文本串中有多少个模板串。可以比较完一个模板字母文本串就右移一位,比较完所有模板串字母,文本串是否包括模板串的信息就保存在1个位置上了。
代码如下
#include<bits/stdc++.h>
using namespace std;
const int N =1e5+100;
bitset<N> m[30],ans;
int main()
{
int t;
char s[N];
while(~scanf("%s",s))
{
scanf("%d",&t);
for(int i=0;s[i]!='\0';i++)
{
m[s[i]-'a'][i+1] =1;
}
while(t--)
{
int flag;
scanf("%d",&flag);
if(flag==1)
{
char cs;
int temp;
scanf("%d %c",&temp,&cs);
m[s[temp-1]-'a'][temp] =0;
m[cs-'a'][temp] =1;
s[temp-1] =cs;
}
else
{
char x[N];
int l,r,len;
ans.set();
scanf("%d%d%s",&l,&r,x);
len =strlen(x);
for(int i=0;i<len;i++)
{
ans &=(m[x[i]-'a']>>i);//比较完一个就右移一位把是否包含模板串的信息保存在一个位置
}
//比较完毕后ans bitset数组中有一个1就代表以这个位置开头包括一个长度为len的模板串
int sum1 =(ans>>(l)).count();//计算l右边有多少模板串
int sum2 =(ans>>(r-len+2)).count();//计算r右边有多少模板串,这里写r-len+2是要不包括r-len+1~r这部分可能存在的模板串,与前缀和类似,求l-r的区间和:x[r]-x[l-1]不能写成x[r]-x[l].
sum1 =max(sum1,sum2);
printf("%d\n",sum1-sum2);
}
}
}
return 0;
}