什么kmp直接就find了!!

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
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

题意: 一个母串一个字串 问母串在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);
    }

}


原文地址:https://www.cnblogs.com/bhd123/p/9453717.html