如果你觉得这篇题解对你有用,可以点个赞或关注再走呗~
注意:
(1)"A"
的哈希值不能映射成0
(2)P
的取值取 131
/13331
Q
的取值为2的64次方
,用于取模。
(3)取模技巧:
开long数组
存储数字,溢出的部分相当于取模。
分析
ACcode
import java.util.*;
public class Main{
static int N=100010,P=131;//P取131或者13331
static long h[]=new long[N];
//开long数组相当于对2的64次方取模,溢出的部分相当于取模。
static long p[]=new long[N];
public static long get(int l,int r)
{
return h[r]-h[l-1]*p[r-l+1]; //前缀和处理l-r的哈希值
}
public static void main(String []args){
Scanner in = new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
String s=in.next();
p[0]=1;//p的0次方是1
h[0]=0;//0个字母的哈希值是0
for(int i=1;i<=n;i++){
p[i]=p[i-1]*P;
//映射成P进制下的数字
h[i]=h[i-1]*P+s.charAt(i-1);
//前缀和哈希:前一段的哈希值加上当前字母的数字
}
while(m-->0)
{
int l1=in.nextInt();
int r1=in.nextInt();
int l2=in.nextInt();
int r2=in.nextInt();
//映射的两串的哈希值相等则说明两字符串相等
if(get(l1,r1)==get(l2,r2))System.out.println("Yes");
else System.out.println("No");
}
}
}