AlenAntonelli

Virus polimorfo

Sep 23rd, 2017
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. /// Virus Polimorfo, Alen Antonelli, 23/09/17 http://www.oia.unsam.edu.ar/_media/prob/c3a10n3p2.pdf
  2. #include <iostream>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. struct Datos {
  7.     vector <int> cadena;
  8.     int n, m;
  9.  
  10.     void leer ()
  11.     {
  12.         cin>>n>>m;
  13.  
  14.         cadena.resize(n+1);
  15.         cadena[0] = 0; ///para que funcione la lógica mas tarde
  16.  
  17.         for (int i=1; i<=n; i++)
  18.             cin>>cadena[i];
  19.     }
  20.  
  21.     void antivirus ()
  22.     {
  23.         vector <int> anti(n+1), pos;
  24.         int cant = 0;
  25.         if ( n>=m )
  26.         {
  27.             for (int i= 1; i<m; i++) ///precarga los primeros m-1 datos
  28.             {
  29.                 int caracter = cadena[i];
  30.                 if (1<=caracter && caracter<=m)
  31.                 {
  32.                     if(!anti[caracter])
  33.                         cant++;
  34.                     anti[ caracter ]++;
  35.                 }
  36.             }
  37.  
  38.  
  39.             for (int i=m; i<=n; i++) /// procesa en base a la bolsita (anti)
  40.             {
  41.                 int pos_ant = i-m;
  42.                 int pos_sig = i;
  43.                 int caract_ant = cadena[pos_ant];
  44.                 int caract_sig = cadena[pos_sig];
  45.  
  46.                 if ( (1<=caract_ant) && (caract_ant<=m) )
  47.                 {
  48.                     anti[caract_ant]--;
  49.                     if (!anti[caract_ant])
  50.                         cant--;
  51.                 }
  52.  
  53.                 if ( (1<=caract_sig) && (caract_sig<=m) )
  54.                 {
  55.                     if (!anti[caract_sig])
  56.                         cant++;
  57.                     anti[caract_sig]++;
  58.                 }
  59.  
  60.                 if (cant==m)
  61.                     pos.push_back(pos_ant+1);///el siguiente a la pos anterior
  62.  
  63.             }
  64.         }
  65.  
  66.         cout<<endl<<pos.size()<<endl;
  67.         for (int i=0; i<pos.size(); i++)
  68.             cout<<pos[i]<<" ";
  69.     }
  70. };
  71.  
  72. int main ()
  73. {
  74.     Datos d;
  75.     d.leer();
  76.     d.antivirus();
  77.  
  78.     return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment