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

相关推荐

05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
实习,投递多份简历没人回...
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
07-01 17:14
中北大学 Java
兄弟们是真是假
牛客46374834...:我在boss上投java岗从来没成功过
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务