两天完成
34.链表中环的入口节点
注意,我的错误在于两个指针初始化。错在指把快指针初始化成head->next->next,慢指针初始化成head,仔细想想这样相当于慢指针比快指针少走了一次!!!
38.二叉树的镜像
思路是对的,就是最后要把原题传入的参数改为引用或二级指针,否则是不能成功把head赋值给root的!!!
4312.出现次数(前缀和问题)
- 出现次数
给定一个长度为 n 的字符串 S=s1s2…sn 以及一个长度为 m 的字符串 T=t1t2…tm。
两个字符串都由小写字母构成。
用 s[l,r] 来表示字符串 S 的子串 slsl+1…sr。
有 q 个询问,每个询问给出两个整数 li,ri(1≤li≤ri≤n),请你计算字符串 T 在 s[li,ri] 中作为子串出现了多少次。
例如,字符串 abacabadabacaba 中共包含 4 个子串 ba,所以 ba 在 abacabadabacaba 中作为子串出现了 4 次。
输入格式
第一行包含三个整数 n,m,q。
第二行包含一个长度为 n 的由小写字母构成的字符串 S。
第三行包含一个长度为 m 的由小写字母构成的字符串 T。
接下来 q 行,每行包含两个整数 li,ri。
输出格式
每个询问输出一行答案,一个整数,表示出现次数。
数据范围
前三个测试点满足 1≤n,m,q≤20。
所有测试点满足 1≤n,m≤1000,1≤q≤105,1≤li≤ri≤n。
输入样例1:
15 2 3
abacabadabacaba
ba
1 15
3 4
2 14
输出样例1:
4
0
3
输入样例2:
3 5 2
aaa
baaab
1 3
1 1
输出样例2:
0
0
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000+5;
int n,m,q;
string S,T;
int s[maxn];
int main()
{
cin>>n>>m>>q;
cin>>S>>T;
S=' '+S;
memset(s,0,sizeof(s));
for(int i=m;i<=n;i++){
s[i]=s[i-1];
if(S.substr(i-m+1,m)==T)
s[i]++;
}
int l,r;
while(q--){
cin>>l>>r;
l=l+m-1;
if(l>r) cout<<0<<endl;
else cout<<s[r]-s[l-1]<<endl;
}
return 0;
}
版权声明:本文为weixin_53356651原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。