【题目描述】:
给定一个字符串 A和一个字符串 B,求 B在 A中的出现次数。A和 B中的字符均为英语大写字母或小写字母。
A中不同位置出现的 B可重叠。
【输入描述】:
输入共两行,分别是字符串 A和字符串 B。
【输出描述】:
输出一个整数,表示 B在 A中的出现次数。
【样例输入】:
zyzyzyz
zyz
【样例输出】:
3
【时间限制、数据范围及描述】:
时间:1s 空间:64M
1<=A,B的长度<=10^6;A、B仅包含大小写字母。
题解:最近泡在字符串海洋里啦,好多之前不太会的算法,都在慢慢熟悉了!冲冲冲!!
一道Hash的题目(又是模板题吨吨吨?)
#include<cmath> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #include<bits/stdc++.h> typedef long long ll; using namespace std; const int N=1090002; const int Q=131; char a[N],b[N]; int main(){ gets(a); gets(b); int n=strlen(a); int m=strlen(b); int ans; if(m>n) { cout<<0; return 0; } ll ha=0,hb=0,fu=1; for(int i=0;i<m;i++){ ha=ha*Q+a[i]; hb=hb*Q+b[i]; fu*=Q; } ans=(ha==hb); for(int i=m;i<n;i++){ ha=ha*Q+a[i]-fu*a[i-m]; ans+=(ha==hb); } cout<<ans<<endl; return 0; }