841.字符串哈希
作者:互联网
给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2,请你判断[l1,r1]和[l2,r2]这两个区间所包含的字符串子串是否完全相同。
字符串中只包含大小写英文字母和数字。
输入格式
第一行包含整数n和m,表示字符串长度和询问次数。
第二行包含一个长度为n的字符串,字符串中只包含大小写英文字母和数字。
接下来m行,每行包含四个整数l1,r1,l2,r2
,表示一次询问所涉及的两个区间。
注意,字符串的位置从1开始编号。
输出格式
对于每个询问输出一个结果,如果两个字符串子串完全相同则输出“Yes”,否则输出“No”。
每个结果占一行。
数据范围
1≤n,m≤105
输入样例:
8 3
aabbaabb
1 3 5 7
1 3 6 8
1 2 1 2
输出样例:
Yes
No
Yes
参考代码
import java.util.Scanner;
public class Main {
static long ULL = (long) Math.pow(2, 64);
static int N = 100010;
static int P = 131;
static long[] h = new long[N];
static long[] p = new long[N];
public static long get(int l, int r) {
return h[r] - h[l - 1] * p[r - l + 1] % ULL;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
sc.nextLine();
String str = sc.nextLine();
p[0] = 1;
for (int i = 1; i <= n; i++) {
p[i] = p[i - 1] * P % ULL;
h[i] = (h[i - 1] * P % ULL + str.charAt(i-1)) % ULL;
}
while ((m--) != 0) {
int l1 = sc.nextInt();
int r1 = sc.nextInt();
int l2 = sc.nextInt();
int r2 = sc.nextInt();
if (get(l1, r1) == get(l2, r2)) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
sc.close();
}
}
标签:包含,841,int,long,sc,static,哈希,字符串 来源: https://www.cnblogs.com/pannnn/p/13806022.html