自己的超时代码O(q*n*m)太大了
#include<bits/stdc++.h>
using namespace std;
int qarr[100010];
int main(){
int n,m,q;
string s,t;
cin>>n>>m>>q;
cin>>s>>t;
for(int i=1;i<=q;i++){
int l,r;
cin>>l>>r;
int ti=0;
for(int j=l-1;j<=r-m;j++){
if(s[j]==t[ti]){
int k=j;
k++;
ti++;
while(s[k]==t[ti]&&k<=r-1&&ti<=m-1){
k++;
ti++;
}
if(ti==m){
qarr[i]++;
}
ti=0;
}
}
}
for(int i=1;i<=q;i++){
cout<<qarr[i]<<endl;
}
return 0;
}
虽然没用,但也学到了一个新函数substr(pos,len);时间复杂度为O(len)
区间求和问题,利用前缀和,时间复杂度O(q+n*m)
#include<bits/stdc++.h>
using namespace std;
int pre_s[1010];//表示范围在1~i的字符串s共包含几个t
int main(){
int n,m,q;
cin>>n>>m>>q;
string s,t;
cin>>s>>t;
s=' '+s;
for(int i=m;i<=n;i++){
pre_s[i]=pre_s[i-1];
if(s.substr(i-m+1,m)==t){
pre_s[i]++;
}
}
for(int i=1;i<=q;i++){
int l,r;
cin>>l>>r;
if(l+m-1>r){//注意特殊条件
cout<<"0"<<endl;
}
else{
cout<<pre_s[r]-pre_s[l+m-1-1]<<endl;//注意边界条件
}
}
return 0;
}