码迷,mamicode.com
首页 > 其他好文 > 详细

Educational Codeforces Round 48 (Rated for Div. 2) B Segment Occurrences

时间:2018-08-16 10:43:35      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:main   pac   kmp   思路   简单   多少   前缀   枚举   stl   

翻译

给你一个字符串\(s\)和另一个字符串\(t\),然后给你\(q\)个区间,问\(s\)在这些区间里的子串有多少个与\(t\)相同。

思路

一道要细心的模拟题,使用\(STL string\),暴力,前缀和,\(Hash\)\(Kmp\)都能做出来,然后我来介绍一下用 \(vector\)的做法。

首先预处理\(s\),从头到位找到每一个长度是字符串t的长度\(m\)的字符串,如果其与\(t\)相等,那么就往vector中压入\(1\),否则压入\(0\),这样,我们就找到每个编号的字符串是否与\(t\)相等

然后我们在读到区间后,枚举这个区间,找到一个长度为\(t\)的长度\(m\)的字符串,看看这个字符串的编号所对应的值是否是\(1\),如果是的话,计数器\(++\)

然后没有了,虽然简单,但是不简单。

Code

#include<bits/stdc++.h>
using namespace std;
vector<int> v;
int main()
{
    int n,m,q;
    string s,t;
    cin>>n>>m>>q;
    cin>>s>>t;
    for(int i=0;i<n;i++)
    {
        if(s.substr(i,m)==t)
            v.push_back(1);
        else
            v.push_back(0);
    }
    while(q--)
    {
        int left,right,ans=0;
        cin>>left>>right;
        for(int i=left-1;i<right;i++)//注意下标从0开始
        {
            if(right-i>=m)
                ans+=v[i];
        }
        cout<<ans<<endl;
    }
    return 0;
}

Educational Codeforces Round 48 (Rated for Div. 2) B Segment Occurrences

标签:main   pac   kmp   思路   简单   多少   前缀   枚举   stl   

原文地址:https://www.cnblogs.com/lyfoi/p/9485064.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!