You are given two strings s and t
, both consisting only of lowercase Latin letters.
The substring s[l..r]
is the string which is obtained by taking characters sl,sl+1,…,sr
without changing the order.
Each of the occurrences of string a
in a string b is a position i (1≤i≤|b|−|a|+1) such that b[i..i+|a|−1]=a (|a| is the length of string a).
You are asked q
queries: for the i-th query you are required to calculate the number of occurrences of string t in a substring s[li..ri]
The first line contains three integer numbers n, m and q (1≤n,m≤103, 1≤q≤105) — the length of string s, the length of string t
and the number of queries, respectively.
The second line is a string s
(|s|=n
), consisting only of lowercase Latin letters.
The third line is a string t
(|t|=m
), consisting only of lowercase Latin letters.
Each of the next q
lines contains two integer numbers li and ri (1≤li≤ri≤n) — the arguments for the i-th query.
10 3 4
codeforces
for
1 3
3 10
5 6
5 7
0
1
0
1
15 2 3
abacabadabacaba
ba
1 15
3 4
2 14
4
0
3
3 5 2
aaa
baaab
1 3
1 1
0
0
题意: 一个母串一个字串 问母串在l,r 中有多少个字串
#include <set> #include <map> #include <cmath> #include <ctime> #include <queue> #include <stack> #include <cstdio> #include <string> #include <vector> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int main() { int n,m,q,c,d,i,ge=0,j,vis[100010]; memset(vis,0,sizeof(vis)); string a,b; cin>>n>>m>>q; cin>>a>>b; int pos=0; while((pos=a.find(b,pos))!=string::npos) { vis[pos+1]=pos+1; pos++; } int l,r; for(i=1; i<=q; i++) { ge=0; scanf("%d%d",&l,&r); for(j=1; j<=r; j++) if(vis[j]!=0&&l<=j&&j<=r-m+1) ge++; printf("%d ",ge); } }