字符串哈希 - SCU - 4438 栈维护哈希前缀和

题目链接:http://acm.scu.edu.cn/soj/problem.action?id=4438
题目大意:
给定一个字符串A和一个字符串B,如果如果B中存在A字符串,就在B中把A字符串去掉,输出最后去掉A字符串之后B字符串

在这里插入图片描述
用一个栈维护字符,如果栈的倒数|A|个数==B那么删除这你个数。

继续添加字符。

根据哈希值的计算公式:(左为高位。相当于p进制的数。)
在这里插入图片描述

根据子串哈希值的计算公式:在这里插入图片描述
那么根据当前栈顶的元素,就能推导下个字符的哈希值。

#include<bits/stdc++.h>

#define ull unsigned long long
using namespace std;
const int maxn=5000006;

ull base =131;
ull g[maxn];
ull p[maxn];

ull Hash(char s[])
{
    int n=strlen(s+1);
    g[0]=0;
    for(int i=1;i<=n;i++)
    {
        g[i]=g[i-1]*base+s[i];
    }
    return g[n];
}

void getp()
{
    p[0]=1;
    for(int i=1;i<=maxn;i++)
    {
        p[i]=p[i-1]*base;
    }
}

ull getLR(int l, int r)//取出T里l - r里面的字符串的hash值
{
    return g[r]-g[l-1]*p[r-l+1];
}

char s[5000060], t[5000060], ans[5000060];

int main()
{
    getp();
    while(~scanf("%s%s",s+1,t+1))
    {
        int Ls=strlen(s+1), Lt=strlen(t+1);
        ull key = Hash(s);
        int tot=0;
        for(int i=1;i<=Lt;i++)
        {
            ans[++tot]=t[i];
            g[tot]=g[tot-1]*base+t[i];
            if(tot>=Ls&&g[tot]-g[tot-Ls]*p[Ls]==key)
            {
                tot-=Ls;
            }
        }
        ans[tot+1]=0;
        printf("%s\n",ans+1);
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值