【UOJ 652】寻找串

【题目描述】:

给定一个字符串 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;
}
原文地址:https://www.cnblogs.com/wuhu-JJJ/p/13511521.html