4.2 perguntas US Missão caneta 4 (Hash-metade)

Aqui Insert Picture Descrição

resolução:

Primeiro hashing. (Analisando a mesma subsequência)

Em seguida, enumerar as duas posições Eu , j eu j , dois representantes da ABA ponto de partida A é i e j.

primeiro [ Eu , Eu + k - 1 ] [I, i + k-1] e [ j , j + k - 1 ] [J, j k-1 +] ser a mesma, em seguida, o binário máximo encontrado que L [ Eu , Eu + eu - 1 ] [I, i + L-1] e [ j , j + eu - 1 ] [J, j G-1 +] .

Desta vez, para Eu Eu começar, [ j + k - 1 , j + eu - 1 ] [J + k-1, j + L-1] para cumprir os requisitos para o fim rosto título da string.
Mas o mesmo i, j ter uma repetição diferente, por isso para o mesmo i, o acima [ j + k - 1 , j + eu - 1 ] [J + k-1, j + L-1] como o segmento, do tipo para o qual o vector de ponderação recheado.

código:

/*
 *  Author : Jk_Chen
 *    Date : 2020-04-02-19.23.43
 */
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define rep(i,a,b) for(int i=(int)(a);i<=(int)(b);i++)
#define per(i,a,b) for(int i=(int)(a);i>=(int)(b);i--)
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pill pair<int, int>
#define fi first
#define se second
void test(){cerr<<"\n";}
template<typename T,typename... Args>void test(T x,Args... args){cerr<<x<<" ";test(args...);}
const LL mod=1e9+9;
const int maxn=1e5+9;
const int inf=0x3f3f3f3f;
LL rd(){ LL ans=0; char last=' ',ch=getchar();
    while(!(ch>='0' && ch<='9'))last=ch,ch=getchar();
    while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
    if(last=='-')ans=-ans; return ans;
}
#define rd rd()
/*_________________________________________________________begin*/

char x[2009];
LL has[2009];
LL bas[2009];
LL getHash(int l,int r){
    return (has[r]-has[l-1]*bas[r-l+1]%mod+mod)%mod;
}

int main(){
    scanf("%s",x+1);
    int len=strlen(x+1);
    bas[0]=1;
    has[0]=0;
    rep(i,1,len){
        bas[i]=bas[i-1]*103%mod;
        has[i]=(has[i-1]*103+(x[i]-'a'))%mod;
    }
    int k;cin>>k;
    int sum=0;
    rep(i,1,len){
        vector<pill>V;
        rep(j,i+k+1,len){
            if(j+k-1>len)break;
            if(getHash(i,i+k-1)!=getHash(j,j+k-1))continue;
            int l=k,r=min(len-j+1,j-1-i),ans=k;
            while(l<=r){
                int mid=l+r>>1;
                if(getHash(i,i+mid-1)==getHash(j,j+mid-1))ans=mid,l=mid+1;
                else r=mid-1;
            }
            V.push_back({j+k-1,j+ans-1});
        }
        if(V.empty())continue;
        sort(V.begin(),V.end());
        int l=V[0].fi,r=V[0].se;

        for(auto P:V){
            if(P.fi>r+1){
                sum+=r-l+1;
                l=P.fi,r=P.se;
            }
            else{
                r=max(r,P.se);
            }
        }
        sum+=r-l+1;
    }
    printf("%d\n",sum);
    return 0;
}

/*_________________________________________________________end*/

Publicado 773 artigos originais · ganhou elogios 345 · Exibições 200.000 +

Acho que você gosta

Origin blog.csdn.net/jk_chen_acmer/article/details/105279655
Recomendado
Clasificación