Educational Codeforces Round 48 (Rated for Div. 2) B Segment Occurrences
Posted lyfoi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 48 (Rated for Div. 2) B Segment Occurrences相关的知识,希望对你有一定的参考价值。
翻译
给你一个字符串(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的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 7 A
Educational Codeforces Round 7
Educational Codeforces Round 90
Educational Codeforces Round 33