Cod sursa(job #1899227)

Utilizator mihaizsZsisku mihaizs Data 2 martie 2017 16:37:37
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;



int main()
{

   fstream f("strmatch.in");
   ofstream q("strmatch.out");

   string str, substr;
   vector<int> solution;

   f >> substr >> str;



    vector<int> fallback;

   fallback.push_back(-1);
   fallback.push_back(0);

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

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



   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)
         {
            solution.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++, current = 0;
   }


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

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




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