当前位置:网站首页>【集训DAY4】询问【Hash】

【集训DAY4】询问【Hash】

2022-08-09 22:35:00 VL——MOESR

在这里插入图片描述

思路:

我们把字符串拆成26个01穿来记录每个字符的位置
然后用字符串hash判断就行了

c o d e code code

#include<iostream>
#include<algorithm>
#include<cstdio>

using namespace std;

int n, m;
char s[200010];
unsigned long long h[26][200010], p[200010], a[26], b[26];

unsigned long long get_(int i, int l, int r) {
    
	return h[i][r] - h[i][l - 1] * p[r - l + 1]; 
}

int main() {
    
	scanf("%d%d", &n, &m);
	scanf("%s", s + 1);
	p[0] = 1;
	for(int i = 1; i <= n; i ++) p[i] = p[i - 1] * 7;
	for(int i = 0; i < 26; i ++)
		for(int j = 1; j <= n; j ++)
			h[i][j] = h[i][j - 1] * 7 + (s[j] == 'a' + i) * 3;
	while(m --) {
    
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z);
		for(int i = 0; i < 26; i ++) {
    
			a[i] = get_(i, x, x + z - 1);
			b[i] = get_(i, y, y + z - 1);
		}
		sort(a, a + 26);
		sort(b, b + 26);
		bool flag = 1;
		for(int i = 0; i < 26; i ++)
			if(a[i] != b[i]) {
    
				flag = 0;
				break;
			}
		if(flag) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
} 
原网站

版权声明
本文为[VL——MOESR]所创,转载请带上原文链接,感谢
https://blog.csdn.net/liuziha/article/details/126234639