B. Segment Occurrence
time limit per test:2 seconds
memory limit per test:256 megabytes
input:standard input
output:standard output
You are given two strings ss and tt, both consisting only of lowercase Latin letters.
The substring s[l..r]s[l..r] is the string which is obtained by taking characters sl,sl+1,…,srsl,sl+1,…,sr without changing the order.
Each of the occurrences of string aa in a string bb is a position ii (1≤i≤|b|−|a|+11≤i≤|b|−|a|+1) such that b[i..i+|a|−1]=ab[i..i+|a|−1]=a (|a||a| is the length of string aa).
You are asked qq queries: for the ii-th query you are required to calculate the number of occurrences of string tt in a substring s[li..ri]s[li..ri].
The first line contains three integer numbers nn, mm and qq (1≤n,m≤1031≤n,m≤103, 1≤q≤1051≤q≤105) — the length of string ss, the length of string ttand the number of queries, respectively.
The second line is a string ss (|s|=n|s|=n), consisting only of lowercase Latin letters.
The third line is a string tt (|t|=m|t|=m), consisting only of lowercase Latin letters.
Each of the next qq lines contains two integer numbers lili and riri (1≤li≤ri≤n1≤li≤ri≤n) — the arguments for the ii-th query.
Print qq lines — the ii-th line should contain the answer to the ii-th query, that is the number of occurrences of string tt in a substring s[li..ri]s[li..ri]
题目大意:输入两个长度分别为n,m的字符串a,b,求在a中指定区域[l,r]上有多少个b。
思路:在a中查找b,每个开头位置设置标记,在给定区域查找标记即可。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <iostream> 5 using namespace std; 6 typedef long long ll; 7 8 int main() 9 { 10 int n,m,k; 11 string a,b; 12 while(scanf("%d%d%d",&n,&m,&k)==3) 13 { 14 cin>>a; 15 cin>>b; 16 while(1) 17 { 18 int p=a.find(b); 19 if(p!=-1) 20 { 21 a[p]='1'; 22 } 23 else 24 break; 25 } 26 while(k--) 27 { 28 int l,r,ans=0; 29 cin>>l>>r; 30 l--; 31 r--; 32 for(int i=l; i<=r-m+1; i++) 33 { 34 if(a[i]=='1') 35 ans++; 36 } 37 printf("%d\n",ans); 38 } 39 } 40 return 0; 41 }