晓宜 2022-05-19 08:36 采纳率: 33.3%
浏览 46
已结题

小蓝的01字符串,搞不懂第13行的判断条件中g为什么要+1

问题遇到的现象和发生背景

题目链接:https://www.lanqiao.cn/problems/1627/learning/

问题相关代码,请勿粘贴截图
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const int N = 5e5+10;
char s[N],t[N];
int n,PP =131;
long long ans;
ull P[N],f[N],g[N];  //P:计算p的i次方,f:s的前缀哈希值,g:t的前缀哈希值
void bin_search(int x){     //用二分法寻找以s[x]为中心的回文串
    int L=0,R=min(x,n-x);
    while(L<R){
        int mid = (L+R+1)>>1;
        if((ull)(f[x]-f[x-mid]*P[mid])==(ull)(g[x+1]-g[x+1+mid]*P[mid]))
              L = mid;
        else R = mid-1;
    }
    ans += L; //最长回文串的长度是L,它内部有L个回文串
}
int main(){
    scanf("%d",&n);   scanf("%s",s+1);
    P[0] = 1;
    for(int i=1;i<=n;i++)  s[i]=='1'? t[i]='0':t[i]='1'; //t是反串
    for(int i=1;i<=n;i++)  P[i] = P[i-1]*PP;             //P[i]=PP的i次方
    for(int i=1;i<=n;i++)  f[i] = f[i-1]*PP + s[i];      //求s所有前缀的哈希值
    for(int i=n;i>=1;i--)  g[i] = g[i+1]*PP + t[i];      //求t所有前缀的哈希值
    for(int i=1;i<n;i++)   bin_search(i); 
    printf("%lld\n",ans);
    return 0;
}
我想要达到的结果

求解释一下哈希值判断的逻辑

 if((ull)(f[x]-f[x-mid]*P[mid])==(ull)(g[x+1]-g[x+1+mid]*P[mid]))

我倒是知道哈希值中两个字符串的组合S1+S2 的哈希值为 H(S1) × Plen(S2) + H(S2)

  • 写回答

1条回答 默认 最新

  • 晓宜 后端领域优质创作者 2022-05-19 10:55
    关注

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月27日
  • 已采纳回答 5月19日
  • 创建了问题 5月19日

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler