原题链接:https://www.acwing.com/problem/content/4315/
字符串很短,查询次数很多,直接暴力预处理+前缀和查询。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m, Q;
string S, T;
char strs[N], strt[N];
int s[N];
int main()
{
scanf("%d%d%d", &n, &m, &Q);
scanf("%s%s", strs, strt);
S = strs, T = strt;
S = ' ' + S;
// s[i] 表示从头开始到i,字串出现了多少次
for (int i = m; i <= n; i ++ )
{
s[i] = s[i -1 ];
if (S.substr(i - m + 1, m) == T)
s[i] ++ ;
}
while (Q -- )
{
int l, r;
scanf("%d%d", &l, &r);
// 在l到r 区间内字串出现多少次,不能直接s[r] - s[l-1]
// 需要考虑子串的结尾,应该是s[r] - s[l+m-1 - 1] 又是一个小细节
l += m - 1;
if (l > r) puts("0");
else printf("%d\n", s[r] - s[l - 1]);
}
return 0;
}