用两种方法做。
First:kmp模板
AC code:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e3+6;int f[N];
void init(string s){
memset(f,0,sizeof(f));
for(int i=1;i<s.size();i++){
int j=f[i];
while(j&&s[i]!=s[j])j=f[j];
f[i+1]=(s[i]==s[j])?j+1:0;
}
}
void find(string a,string s){
int ans=0,j=0;init(s);
for(int i=0;i<a.size();i++){
while(j&&a[i]!=s[j])j=f[j];
if(a[i]==s[j])j++;
if(j==s.size())ans++;
}
cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
string s,t;int n,m,q;
cin>>n>>m>>q>>s>>t;
while(q--){
int x,y;cin>>x>>y;
string a;
for(int i=x-1;i<=y-1;i++)a+=s[i];
find(a,t);
}
}
Second:
暴力求得倒序的前缀和即可。
AC code:
#include<iostream>
using namespace std;
const int N=1790;
int n,m,q,res[N],i,j,k;string s,t;
int main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>n>>m>>q>>s>>t;
for(i=n-1;i>=0;i--){
for(j=0,k=1;j<m;j++)s[i+j]!=t[j]?k=0:0;
res[i]=res[i+1]+k;
}
while(q--){
int a,b;cin>>a>>b;a--;
cout<<(b>=m&&b-a>=m?res[a]-res[b-m+1]:0)<<endl;
}
}