题目链接:
题意:
有两个字符串a,b;
给出q个查询l,r;
求在a的l,r中的b的个数;
思路:
本来想用前缀和,但是失败了呢,因为我发现如果样例为
a:codeforcefors
b:for
我用前缀和的话a为0000001111122
如果一个q为6 9,输出为1,实际为0;
可能还有别的前缀和方法可以求得,但我没有想到,如果有人知道还望告诉我一声哈~
我看了别人的代码思路大概是这样的,比如样例:
a:codeforcefors
b:for
预处理为0000001000010
即在a中每个b存在的地方尾部标记1,对于每个查询l,r,加起来,但是注意!!要从b的长度才开始加,因为比如查询为6 9(orce),虽然与处理中有1,但是并没有完整的包含for这个b字符,输出应该是0,而非1;
AC代码如下:
#include <cstdio>
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
int main()
{
int n,m,q;
char a[10001],b[10001],c[10001],temp[10001];
memset(temp,0,sizeof(temp));
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
a[n+1]='\0';
for(int i=1;i<=m;i++)
{
cin>>b[i];
}
b[m+1]='\0';
for(int i=1;i<=n-m+1;i++)
{
int k=1;
for(int j=i;j<i+m;j++)
{
c[k]=a[j];
k++;
}
c[k]='\0';
if(strcmp(c+1,b+1)==0)
{
temp[i+m-1]=1;
}
}
while(q--)
{
int l,r;
int sum=0;
scanf("%d%d",&l,&r);
for(int i=l;i<=r;i++)
{
if(i-l+1>=m)
{
sum=sum+temp[i];
}
}
printf("%d\n",sum);
}
}