T2的另一种做法

K匹配

https://ac.nowcoder.com/acm/contest/7613/B

T2的std用了kmp,但是我在场上做题时没想到用这种算法(其实是太菜了不会)(划掉
我的思路是对两个字符串都跑一遍hash,再用hash找出第一个字符串中的匹配位置,将每个相等子串左右两边将没有计算过的(字符串长度+1)乘起来累加到答案中。
这样说起来可能不太清楚,可以尝试自己把字符串写下来,再配合代码食用。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define ha 10000010
using namespace std;
typedef unsigned long long ll;
int len1,len2;
char s1[ha],s2[ha];
ll hsh[ha],hsh2[ha];
ll hshlen[ha];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>len1>>len2;
    cin>>(s1+1);
    cin>>(s2+1);
    hshlen[0]=1;
    for(int i=1;i<=len1;++i){
        hsh[i]=hsh[i-1]*131+(s1[i]-'a'+1);
        hshlen[i]=hshlen[i-1]*131;
    }
    for(int i=1;i<=len2;++i){
        hsh2[i]=hsh2[i-1]*131+(s2[i]-'a'+1);
    }
    ll ans=0;
    int cnt=0,lst=0;
    for(int i=1;i+len2-1<=len1;++i){
        if(hsh[i+len2-1]-hsh[i-1]*hshlen[len2]==hsh2[len2]){
            ++cnt;
            ll lft=i-1-lst;
            ll rit=len1-(i+len2-1);
            ans+=(lft+1)*(rit+1);
            lst=i;
        }
    }
    cout<<ans<<endl;
    return 0;
}
全部评论
hash和kmp没区别的啊
点赞 回复 分享
发布于 2020-10-28 20:10

相关推荐

勇敢的联想人前程似锦:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
5 收藏 评论
分享
牛客网
牛客企业服务