字符串哈希匹配字符串

字符串哈希匹配字符串

问题描述

这是一道模板题。

给定一个长度为 nn 仅由小写字母构成的字符串 SS,再给定 qq 组查询,每次查询给定 44 个整数 l1,r1,l2,r2l1​,r1​,l2​,r2​。你需要输出 Sl1∼r1Sl1​∼r1​​ 与 Sl2∼r2Sl2​∼r2​​ 是否相同。

输入格式

第一行输入两个正整数 n,qn,q。(1≤n,q≤2×105)(1≤n,q≤2×105)。

第二行输入一个字符串 SS。((a ≤Si≤≤Si​≤ z,1≤i≤n),1≤i≤n)。

接下来 qq 行每行输入 44 个正整数 l1,r1,l2,r2l1​,r1​,l2​,r2​。(1≤l1≤r1≤n,1≤l2≤r2≤n,r1−l1=r2−l2)(1≤l1​≤r1​≤n,1≤l2​≤r2​≤n,r1​−l1​=r2​−l2​)。

输出格式

输出 qq 行,对于每次查询,如果查询的两个字符串相同输出 Yes,否则输出 No

样例输入

复制代码
4 3
abbc
1 2 2 3
2 2 3 3
1 3 2 4

样例输出

复制代码
No
Yes
No

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    static int N = 2*100010,p=131;//改值减少冲突
    static int a[]=new int[N];
    static int b[]=new int[N];
    
    public static void main(String[] args) throws IOException {
    
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        int n=Integer.parseInt(br.readLine());
        String g[] = br.readLine().split(" ");
        int n=Integer.parseInt(g[0]),q=Integer.parseInt(g[1]);
        String string=br.readLine();
//        h[i]=h[i−1]×p+s[i], h[0]=0
//        		p:基数(通常取质数,如 (131、13331))
//        		(s[i]):字符串第 i 位字符的 ASCII 值(示例中 A=65,B=66,C=67)		
//        h[l,r]=h[r]−h[l−1]×p^(r−l+1)
        
        		
        b[0]=1;
        for (int i = 1; i <= n; i++) {
			b[i]=b[i-1]*p;
			a[i]=a[i-1]*p+string.charAt(i-1);
		}
        for (int i = 0; i <q; i++) {
        	g = br.readLine().split(" ");
        	int l1=Integer.parseInt(g[0]),r1=Integer.parseInt(g[1]);
        	int l2=Integer.parseInt(g[2]),r2=Integer.parseInt(g[3]);
        	if(getHash(l1, r1,string)==getHash(l2, r2,string)){
        		System.out.println("Yes");
        	}else{
        		System.out.println("No");
        	}
		}
    }
    static int getHash(int l,int r,String string){
    	return a[r]-a[l-1]*b[r-l+1];
    }
}

双哈希:

复制代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    static int N = 2*100010,p1=131,p2=13331,mod1=(int)(1e9)+7,mod2=(int)(1e9)+9;//改p值减少冲突
    static long a1[]=new long[N];//采用long
    static long b1[]=new long[N];
    static long a2[]=new long[N];
    static long b2[]=new long[N];
    
    public static void main(String[] args) throws IOException {
    	
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        int n=Integer.parseInt(br.readLine());
        String g[] = br.readLine().split(" ");
        int n=Integer.parseInt(g[0]),q=Integer.parseInt(g[1]);
        String string=br.readLine();
//        h[i]=h[i−1]×p+s[i], h[0]=0
//        		p:基数(通常取质数,如 (131、13331))
//        		(s[i]):字符串第 i 位字符的 ASCII 值(示例中 A=65,B=66,C=67)		
//        h[l,r]=h[r]−h[l−1]×p^(r−l+1)
        
        		
        b1[0]=1;
        for (int i = 1; i <= n; i++) {
			b1[i]=b1[i-1]*p1%mod1;
			a1[i]=(a1[i-1]*p1+string.charAt(i-1))%mod1;
		}
        b2[0]=1;
        for (int i = 1; i <= n; i++) {
			b2[i]=b2[i-1]*p2%mod2;
			a2[i]=(a2[i-1]*p2+string.charAt(i-1))%mod2;
		}
        for (int i = 0; i <q; i++) {
        	g = br.readLine().split(" ");
        	int l1=Integer.parseInt(g[0]),r1=Integer.parseInt(g[1]);
        	int l2=Integer.parseInt(g[2]),r2=Integer.parseInt(g[3]);
        	if(getHash1(l1, r1,string)==getHash1(l2, r2,string) &&
        	  getHash2(l1, r1,string)==getHash2(l2, r2,string)	
        	 ){
        		System.out.println("Yes");
        	}else{
        		System.out.println("No");
        	}
		}
    }
    static int getHash1(int l,int r,String string){
    	return (int)((a1[r]-a1[l-1]*b1[r-l+1])%mod1+mod1)%mod1;
    }
    static int getHash2(int l,int r,String string){
    	return (int)((a2[r]-a2[l-1]*b2[r-l+1])%mod2+mod2)%mod2;
    }
}
相关推荐
GeekZHR13 分钟前
C语言指针2:数组名、二级指针、指针数组,一次把“指针和数组“讲透
c语言·数据结构·算法·指针
h_a_o777oah16 分钟前
【算法基础】卡特兰数:递推定义与折线对称公式推导及解题策略
c++·算法·acm·组合数学·卡特兰数·反射原理·动态规划dp
JAI科研25 分钟前
Deepseek Agent Harness教程(二) | DeepSeek Harness 设计思路
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·vllm
还不秃顶的计科生30 分钟前
具身智能论文学习10:π0: A Vision-Language-Action Flow Model for General Robot Control
人工智能·深度学习·算法·机器学习·语言模型·vla·vlm
happyprince37 分钟前
02-具体观 — Cordis 算法与实现剖析
算法
烬羽42 分钟前
求第 K 大,为什么反而要用最小堆?
javascript·数据结构·算法
没落之王1 小时前
易学使者郑氏正脉郑冰推演马航事件
大数据·人工智能·算法·机器学习·可用性测试
阿部多瑞 ABU2 小时前
告别手工核图:基于 .NET + MuPDFCore 的 CAD 等轴测 PDF 材料表提取与新旧版本对比实战
后端·算法·ui·pdf·c#
郝学胜-神的一滴2 小时前
并查集深度入门:从玄学抽象到 QuickFind & QuickUnion 源码实战
数据结构·c++·python·程序人生·算法·软件开发
比奇堡裤头村2 小时前
统计学习方法——决策树
算法·决策树·学习方法