Z-box / Z-algoritmo de coincidencia de cadenas

breve introducción

z [i]: para i y la posición de la cadena de prefijo original de la misma longitud es el número

p [] + "#" + S [] - cuerdas encontrado resultados para cada cadena de texto de la misma posición y su prefijo

El procesamiento de matriz z

Z [0] = 0 no es válida, con z [k] (k <i) para liberar z [i]

Z aspecto bastante bueno antes de que pueda cubrir la corriente i, y el límite derecho de la cubierta derecha mejor l, r es el cuadro de límite

si (sin ZBOX anterior a la cubierta) el proceso de enumeración tuvo que responder a éste de la violencia i

else if (tiene) s [i] se puede sobrescribir tan s [i] es inevitable en el s [0 ~ z [j] - 1] j al principio de esta sección destina a cubrir la corriente máxima se mantiene a la i límite derecho

Así que ahora vamos a ir a buscar la posición s [i] se asigna en la cadena original, es decir, i - l

En este momento Obviamente, que s en el rango de cuadro [i ~ r] y el mapeo s [il ~ rl] es la misma longitud de esta sección es L = r - i + 1

Es fácil ver dos tipos de situaciones:

1.z [i - l] <L se puede derivar directamente z [i] = z [i - l]

2. El exceso de parte de la frontera tenía que encontrar una enumeración de la violencia

 

plantilla

// cadenas de texto LEN-- coinciden len-- cuerdas

void getz(){
	int l = 0,r = 0;
	z[0] = 0;
	for(int i = 1;i <= LEN + len; i++){
		if(i > r){
			int n = 0;
			while(p[n] == p[i + n]) n++;
			if(n){
				l = i;
				r = i + n - 1;
			}
			z[i] = n;
		}
		else{
			if(z[i - l] < r - i + 1) z[i] = z[i - l];
			else{
				int n = 1;
				while(p[r - i + n] == p[r + n]) n++;
				r = r + n - 1;
				l = i;
				z[i] = r - l + 1;
			}
		}
	}
}

 

Publicado 31 artículos originales · ganado elogios 5 · Vistas 1365

Supongo que te gusta

Origin blog.csdn.net/qq_43685900/article/details/103147798
Recomendado
Clasificación