Hash de cadena ---------------------------------------- plantilla

Dada una cadena de longitud n, y luego m consultas, cada consulta contiene cuatro enteros l1, r1, l2, r2, juzgue los dos intervalos [l1, r1] y [l2, r2] Si las subcadenas de cadena contenidas son idénticas.

La cadena contiene solo letras y números en mayúscula y minúscula en inglés.

Formato de entrada La
primera línea contiene enteros n y m, que indican la longitud de la cadena y el número de consultas.

La segunda línea contiene una cadena de longitud n, que contiene solo letras y números en mayúsculas y minúsculas en inglés.

Las siguientes m líneas, cada línea contiene cuatro enteros l1, r1, l2, r2, que representan los dos intervalos involucrados en una consulta.

Tenga en cuenta que la posición de la cadena de caracteres comienza desde 1.

Formato de salida
Para cada consulta, se genera un resultado. Si las subcadenas de cadena de dos caracteres son idénticas, se genera "Sí"; de lo contrario, se genera "No".

Cada resultado está en una línea.

Rango de datos
1≤n, m≤105
Muestra de entrada:
8 3
aabbaabb
1 3 5 7
1 3 6 8
1 2 1 2
Muestra de salida:

No

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1000;
typedef unsigned long long ull;
int n,k;
ull P=131;
ull h[N],p[N];
char s[N];
ull get(ull l,ull r)
{
	return h[r]-h[l-1]*p[r-l+1]; 
}
int main()
{
	cin>>n>>k;
	cin>>(s+1);
	p[0]=1;
	for(int i=1;i<=n;i++)
	{
		p[i]=p[i-1]*P;
		h[i]=h[i-1]*P+s[i];
	}
	while(k--)
	{
		int l1,r1,l2,r2;
		cin>>l1>>r1>>l2>>r2;
		if(get(l1,r1)==get(l2,r2)) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
}

572 artículos originales publicados · elogiados 14 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_43690454/article/details/105452497
Recomendado
Clasificación