Gravatar
Untitled
积分:110
提交:33 / 96

算法:字符串哈

方法通过将字符串的每一位字符转化为一个P进制数(P一般取较大的素数,如131,1007等)取模或用$unsigned long long$自然溢出,再利用前缀和求区间和进行匹配


参考代码:


#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
 
int res;
string s;
 
int const P=131;  //这里使用131进制数
ULL p[1000010],f[1000010]; //转化进制是用的数组和前缀和数组
 
int main(){
    f[0]=0,p[0]=1;
    cin>>s;
    s=" "+s;
    for (int i=1;i<=s.length();i++){
        f[i]=f[i-1]*P+(s[i]-'a'+1);  //将s转化为数
        p[i]=p[i-1]*P;  //和转化进制的方式相似
    }
    int n;
    ULL res1,res2;
    scanf("%d",&n);
    int l1,l2,r1,r2;
    for (int i=1;i<=n;i++){
        scanf("%d %d %d %d",&l1,&r1,&l2,&r2);
        res1=f[r1]-f[l1-1]*p[r1-l1+1];
        res2=f[r2]-f[l2-1]*p[r2-l2+1];
        if (res1==res2) printf("Yes\n");
        else printf("No\n");
    }
    
    return 0;
}



题目3151  兔子与兔子      5      评论
2023-07-21 17:05:59