Description
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].
Input
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.
Output
Print q lines — the i-th line should contain the answer to the i-th query, that is the number of occurrences of string t in a substring s[li..ri].
Sample Input
Input
10 3 4
codeforces
for
1 3
3 10
5 6
5 7
Output
0
1
0
1
Input
15 2 3
abacabadabacaba
ba
1 15
3 4
2 14
Output
4
0
3
Input
3 5 2
aaa
baaab
1 3
1 1
Output
0
0
Hint
In the first example the queries are substrings: "cod", "deforces", "fo" and "for", respectively.
题目意思:给出一条母串,给出一条子串,查询母串的某一个区间,问该区间有多少条子串。
解题思路:我是用string中的find来做的,find可以有两个参数,一个是子串,一个是在母串中的位置,也就是开始查询的位置,先利用find找到所有子串的起始位置,相当于打了一张表,之后查询区间,就是访问该区间中合法的子串起始位置的数量,注意子串的长度+起始位置不能越界!
1 #include<cstdio> 2 #include<cstring> 3 #include<string> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 int main() 8 { 9 int n,m,q,i,j,l,r,len; 10 int counts; 11 int vis[10010]; 12 string s1,s2; 13 cin>>n>>m>>q; 14 cin>>s1>>s2; 15 len=s2.size(); 16 memset(vis,0,sizeof(vis)); 17 string::size_type pos=0; 18 while((pos=s1.find(s2,pos))!=string::npos) 19 { 20 vis[pos+1]=pos+1; 21 pos++; 22 }///打表标记母串中出现子串的位置 23 for(i=1;i<=q;i++) 24 { 25 counts=0; 26 scanf("%d%d",&l,&r); 27 for(j=l;j<=r;j++) 28 { 29 if(vis[j]!=0&&vis[j]+len-1<=r)///查询区间内出现子串并且不会越界 30 { 31 counts++; 32 } 33 } 34 printf("%d ",counts); 35 } 36 return 0; 37 }