题目描述
给定一个长度为 n的字符串 以及一个长度为 m 的字符串 T=
。
两个字符串都由小写字母构成。
用 来表示字符串 S的子串
。
有 q 个询问,每个询问给出两个整数(
),请你计算字符串 T在
中作为子串出现了多少次。
例如,字符串 abacabadabacaba
中共包含 4个子串 ba
,所以 ba
在 abacabadabacaba
中作为子串出现了 4次。
输入格式
第一行包含三个整数 n,m,q。
第二行包含一个长度为 n 的由小写字母构成的字符串 S。
第三行包含一个长度为 m 的由小写字母构成的字符串 T。
接下来 q 行,每行包含两个整数 。
输出格式
每个询问输出一行答案,一个整数,表示出现次数。
数据范围
前三个测试点满足
所有测试点满足
输入样例1:
15 2 3
abacabadabacaba
ba
1 15
3 4
2 14
输出样例1:
4
0
3
输入样例2:
3 5 2
aaa
baaab
1 3
1 1
输出样例2:
0
0
主要的算法思路就是前缀和,最后用pre[r]-pre[l-1]就是出现的次数。
在判断出现的次数的时候,可以使用string substr来获取字符串的某一字串来和T比较是否相同。
string substr (size_t pos = 0, size_t len = npos) const;
pos->所需的子字符串的起始位置
len->复制的字符数目
C++AC代码
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const int maxn = 1010;
int n,m,q,l,r,pre[maxn];
string S,T,st;
int main(){
cin>>n>>m>>q;
cin>>S>>T;
S=' '+S;
for(int i=m;i<=n;i++){
pre[i]=pre[i-1];
if(S.substr(i-m+1,m)==T) pre[i]++;
}
while(q--){
cin>>l>>r;
l+=m-1;
if(l>r) cout<<0<<endl;
else cout<<pre[r]-pre[l-1] <<endl;
}
return 0;
}