• 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
    ",counts);
    35     }
    36     return 0;
    37 }
  • 相关阅读:
    Altium Designer中各层的含义
    国外现在有哪些众筹网站呢?
    C# 代码 手工 配置 Log4Net 2种方法
    Windows 7 里进程管理器里面的各列是什么含义?主要是和内存有关的内存-专用工作集,内存-工作集,内存-提交大小???
    C# .Net 下 x86使用大内存的处理
    CV学习日志:CV开发之关联Gazebo/Webots/ROS2
    CV学习日志:CV开发之Windows10环境搭建
    CV学习日志:CV开发之Ubuntu2004和WLS2环境搭建
    ROS2学习日志:ROS2Cartgrapher使用与调试
    ROS2学习日志:QoS要点总结
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/9452869.html
Copyright © 2020-2023  润新知