CF113B Petr#(字符串哈希)

Posted zzctommy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF113B Petr#(字符串哈希)相关的知识,希望对你有一定的参考价值。

CF113B Petr#

大概就是字符串匹配加一个字符串哈希判重。懒得打kmp,就用字符串哈希匹配了。

字符串哈希大概就是把字符串转成一个p进制的数,每一段字符串都有一个对应的哈希值。p尽量取质数

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const int N=2005;
const int pr=131;
ull power[N],h[N],b,e;
char t[N],sb[N],se[N];
int tx,ty,x[N],y[N],lt,lb,le,ans;
void pre() {
    power[0]=1;
    for(int i=1; i<=lt; ++i)
        power[i]=power[i-1]*pr,h[i]=h[i-1]*pr+t[i]-'a'+1;
    for(int i=1; i<=lb; ++i)b=b*pr+sb[i]-'a'+1;
    for(int i=1; i<=le; ++i)e=e*pr+se[i]-'a'+1;
}
ull has(int l,int r) {
    return h[r]-h[l-1]*power[r-l+1];
}
unordered_map<ull,bool>mp;
int main() {
    scanf("%s%s%s",t+1,sb+1,se+1);
    lt=strlen(t+1);
    lb=strlen(sb+1);
    le=strlen(se+1);
    pre();
    for(int i=1; i<=lt-lb+1; ++i) 
        if(has(i,i+lb-1)==b)x[++tx]=i;
    for(int i=le; i<=lt; ++i)
        if(has(i-le+1,i)==e)y[++ty]=i;
    for(int i=1; i<=tx; ++i)
        for(int j=1; j<=ty; ++j)
            if(x[i]<=y[j]&&y[j]-x[i]+1>=max(le,lb))
            {
                ull ha=has(x[i],y[j]);
                if(!mp[ha])++ans,mp[ha]=true;
            }
    printf("%d
",ans);
    return 0;
}

以上是关于CF113B Petr#(字符串哈希)的主要内容,如果未能解决你的问题,请参考以下文章

Hello 2019 B. Petr and a Combination Lock

CF1056E Check Transcription 字符串哈希

CodeForces727E/CF727EGames on a CD (字符串哈希)

CF1320D Reachable Strings [字符串哈希]

BEV感知PETR-V1和PETR-V2

cf1200 E Compress Words(哈希)