Recuento de listas que no son un subconjunto de ninguna otra lista dada

Dadas N listas de strings, la tarea es encontrar el recuento de listas que no son una sublista de ninguna otra lista dada.
Ejemplos: 
 

Entrada: [[“hola”, “hola”, “hola”], [“hola”, “adiós”], [“hola”, “hola”]] 
Salida:
Explicación 
La tercera lista es un subconjunto de la primera lista, por lo tanto, la primera y la segunda lista son las listas requeridas. 
Entrada: [[“geeksforgeeks”, “geeks”], [“geeks”, “geeksforgeeks”]] 
Salida:
Explicación: Ambas listas forman parte del mismo conjunto de strings. 
 

Enfoque 
Siga los pasos a continuación para resolver el problema: 
 

  1. En primer lugar, enumere todas las strings posibles en todos los vectores, es decir, asígneles un número entero.
  2. Luego, use un Bitset para todas las listas individuales para almacenar las strings presentes en ellas.
  3. Compara los conjuntos de bits. Si uno de los conjuntos de bits es un subconjunto de otro, ignore esa lista. De lo contrario, inserte el índice de esa lista en un conjunto.
  4. Imprime todos los índices del conjunto.

El siguiente código es la implementación del enfoque anterior:
 

C++

// C++ program to find all lists
// which are not a subset of any
// other given lists
#include <bits/stdc++.h>
using namespace std;
 
#define N 50005
 
// Function to print all lists which
// are not a subset of any other lists
void findNonSubsets(vector<vector<string> >& v,
                    vector<int>& ans)
{
    unordered_map<string, int> mp;
    int id = 1;
    // Enumerate all strings
    // present in all lists
    for (int i = 0; i < v.size(); i++) {
        for (int j = 0; j < v[i].size(); j++) {
            if (mp.count(v[i][j]) > 0)
                continue;
 
            mp[v[i][j]] = id++;
        }
    }
 
    // Compute and store bitsets
    // of all strings in lists
    vector<bitset<N> > v1;
 
    for (int i = 0; i < v.size(); i++) {
        bitset<N> b;
        for (int j = 0; j < v[i].size(); j++) {
            b[mp[v[i][j]]] = 1;
        }
        v1.push_back(b);
    }
    for (int i = 0; i < v.size(); i++) {
        bool flag = false;
        for (int j = 0; !flag and j < v.size(); j++) {
            if (i != j) {
                // If one of the bitsets is
                // a subset of another, the
                // logical AND is equal to the
                // subset(intersection operation)
                if ((v1[i] & v1[j]) == v1[i]) {
                    flag = true;
                }
            }
        }
 
        if (!flag) {
            ans.push_back(i);
        }
    }
    return;
}
 
// Driver Program
signed main()
{
    vector<vector<string> > v
        = { { "hey", "hello", "hi" },
            { "hey", "bye" },
            { "hey", "hi" } };
 
    vector<int> ans;
    findNonSubsets(v, ans);
 
    if (ans.size() == 0) {
        cout << -1 << endl;
        return 0;
    }
 
    for (int i = 0; i < ans.size(); i++) {
        cout << ans[i] << " ";
    }
 
    return 0;
}
Producción: 

0 1

 

Complejidad Temporal: O ( N * M )  
Espacio Auxiliar: O ( N * M )
 

Publicación traducida automáticamente

Artículo escrito por Shrey Tanna y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *