Cod sursa(job #1899069)

Utilizator M.AndreiMuntea Andrei Marius M.Andrei Data 2 martie 2017 15:13:20
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;


fstream f{ "strmatch.in" };
ofstream q{ "strmatch.out" };

void initFailureFunction(string& str, vector<int>& fallback)
{
   fallback.push_back(-1);
   fallback.push_back(0);

   int size = str.size();
   auto cnt = 0, i = 2;

   while(i < size)
   {
      if (str[i-1] == str[cnt])
      {
         fallback.push_back(cnt + 1);
         cnt++; i++;
      }
      else if (cnt > 0) cnt = fallback[cnt];
      else fallback.push_back(0), i++;
   }
}


void KMP(string& str, string& substr, vector<int>& sols)
{
   vector<int> fallback;
   initFailureFunction(substr, fallback);

   int current = 0, sizeStr = str.size(), sizeSubstr = substr.size(), start = 0;

   while(start + current  < sizeStr)
   {
      if (str[start + current] == substr[current])
      {
         if (current == sizeSubstr - 1)
         {
            sols.push_back(start);
            start = start + current - fallback[current];
            current = fallback[current];
         }
         else current++;
      }
      else if (fallback[current] > -1) start = start + current - fallback[current], current = fallback[current];
      else start = start + 1, current = 0;
   }

}

int main()
{
   string str, substr;
   vector<int> solution;
   int size;

   f >> substr >> str;
   KMP(str, substr, solution);
   
   q << solution.size() << "\n";
   size = min(1000, static_cast<int>(solution.size()));

   for (auto i = 0; i < size; ++i) q << solution[i] << " ";


   f.close();
   q.close();
   return 0;
}