Algoritmos XOR comunes: base lineal

texto

Teoría de la base lineal

1.0 ¿Qué es una base lineal?

Una base lineal es un conjunto de números, y cada secuencia tiene al menos una base lineal. Tomando varios números en la base lineal para XOR puede obtener cualquier número en la secuencia original.

2.0 Tres propiedades de la base lineal

  • Cualquier número en la secuencia original se puede obtener haciendo XORing algunos números en la base lineal
  • Cualquier número en la base lineal no puede ser XORed a 0
  • El número de números en la base lineal es único, y bajo la premisa de mantener la propiedad uno, el número de números es el menor

3.0 Construcción de Base Lineal

Entonces, ¿cómo se construye?

Deje que la matriz d dd represente la base lineal de la secuencia a aa y los subíndices comiencen desde 0 00 . (Para facilitar la comprensión, sea x ( 2 ) el número binario de x

void insert(ll x)
{
    for(int i=60;i>=0;i--)
    {
        if(x&(1ll<<i))//注意,如果i大于31,前面的1的后面一定要加ll
        {
            if(d[i])x^=d[i];
            else
            {
                d[i]=x;
                break;//插入成功就退出
            }
        }
    }
}

De acuerdo con esto, podemos obtener una propiedad sobre el arreglo d: si d [ i ] no es 0, entonces el i + 1 i+1i+1th bit de d[i] (2) debe ser 1, y d [ i ] El bit más alto de (2) es el bit i + 1.

El entendimiento personal es descomponer un número en binario y luego realizar XOR constante. Si se convierte en 0, prueba que se puede obtener mediante XOR de otros números en la base lineal, de lo contrario, se puede insertar con éxito.

Prueba de propiedad de base lineal

1.0 Propiedades de prueba 1

Después de conocer el método de construcción de la base lineal, podemos pensar fácilmente en cómo probar la propiedad 1 11. Supongamos que hay un número x xx en la secuencia original e intentamos usarlo para construir la base lineal. , entonces habrá dos resultados: -1. La base lineal no se puede insertar con éxito 2. La base lineal se inserta con éxito.
inserte la descripción de la imagen aquí

2.0 Demostración de propiedades 2

inserte la descripción de la imagen aquí

3.0 Propiedades de prueba 3

inserte la descripción de la imagen aquí

Aplicaciones de propiedades de base lineal

¿Cómo encontrar el valor máximo?

¿Cómo encontrar en una secuencia, tomar varios números para que su suma XOR sea la más grande?

Primero construya la base lineal de esta secuencia y luego comience desde el bit más alto de la base lineal. Si el elemento de la base lineal XOR de la respuesta actual puede volverse más grande, entonces XOR, y el valor inicial de la respuesta es 0 00.
el código se muestra a continuación:

ll ans()
{
    ll anss=0;
    for(int i=60;i>=0;i--)//记得从线性基的最高位开始
    if((anss^d[i])>anss)anss^=d[i];
    return anss;
 }   

¿Por qué es resolver un proceso codicioso?

Como se mencionó anteriormente, el bit i + 1 de d[i] (2) debe ser 1. Si lo piensas aquí, no son más que dos casos:

  • El i + 1 i+1i+1 bit de ans(2) es 0.
    En este caso, ans definitivamente será más grande después de XORing d[i], por lo que elegimos XOR.
    Algunas personas pueden preguntar, aunque el bit i+1 se convierte en 1 después de ans XOR d[i], los siguientes bits 1 ~ i pueden verse afectados. No importa cómo cambie después, incluso si los siguientes 1 11 ~ i ii bits pueden convertirse en 1, la contribución no es tan grande como la contribución del i + 1 i+1i+1 th bit que se convierte en 1.
  • El bit i + 1 de ans(2) es 1.
    Si ans ansans XOR d [ i ], entonces el bit i+1 se convertirá en 0, y el bit i+1 se convertirá en 0. De acuerdo con la idea anterior, es necesario hacer que el bit más alto sea lo más grande posible, por lo que en este momento, ans no puede hacer XOR d[i].

¿Cómo encontrar el valor mínimo?

Tenga en cuenta que esto se refiere al valor mínimo que se puede aplicar XOR con los elementos en la base lineal.

Obviamente es el d[i] más pequeño, porque el d[i] más pequeño será mayor sin importar quién sea XOR.

Si desea encontrar el valor mínimo que se puede aplicar XOR en toda la secuencia en lugar del valor mínimo que se puede XOR en la base lineal de esta secuencia, debe verificar si hay elementos que no se pueden insertar en la base lineal. Si lo hay, entonces el valor mínimo es 0. De lo contrario, sigue siendo el d[i] más pequeño.

long long query_min()
{
    for (int i=0;i<=60;i++)
        if (d[i])
            return d[i];
    return 0;
}

¿Cómo encontrar el k-ésimo valor más pequeño?

inserte la descripción de la imagen aquí

void work()//处理线性基
{
	for(int i=1;i<=60;i++)
	for(int j=1;j<=i;j++)
	if(d[i]&(1ll<<(j-1)))d[i]^=d[j-1];
}

if(d[i]&(1ll<<(j-1)))d[i]^=d[j-1];, el bit más alto de d[i] es i+1, entonces es d[ j-1]


ll k_th(ll k)
{
	if(k==1&&tot<n)return 0;//特判一下,假如k=1,并且原来的序列可以异或出0,就要返回0,tot表示线性基中的元素个数,n表示序列长度
	if(tot<n)k--;//类似上面,去掉0的情况,因为线性基中只能异或出不为0的解
	work();
	ll ans=0;
	for(int i=0;i<=60;i++)
	if(d[i]!=0)
	{
		if(k%2==1)ans^=d[i];
		k/=2;
	}
}

¡La base lineal se procesa para que el tamaño pueda ser discriminado por binario! ! !

Epílogo


"Si estás indeciso, puedes preguntarle a la brisa primaveral, y si la brisa primaveral no habla, seguirás a tu corazón" significa: si tienes dudas sobre algo, pregúntale a la brisa primaveral cómo hacerlo. . "Si no está decidido, puede preguntarle a la brisa primaveral. Si la brisa primaveral no habla, seguirá su corazón". La oración proviene del "Jianlai" escrito por el escritor de Internet "Fenghuo Opera Princes". El texto original es: "Si estás indeciso, puedes preguntarle a la brisa primaveral. Sigue tu corazón".

inserte la descripción de la imagen aquí


Supongo que te gusta

Origin blog.csdn.net/weixin_46627433/article/details/123800475
Recomendado
Clasificación