Segment Occurrences(string find函数)

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\n",counts);
35     }
36     return 0;
37 }

 

posted @ 2018-08-10 08:47  王陸  阅读(1820)  评论(0编辑  收藏  举报