Cod sursa(job #2372514)

Utilizator dey44andIoja Andrei-Iosif dey44and Data 7 martie 2019 09:37:31
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda pregatire_cls12_oji Marime 1.26 kb
#include <fstream>
#include <string>
#include <vector>

#define NMAX 1000005

using namespace std;

ifstream in("strmatch.in");
ofstream out("strmatch.out");

string original, pattern;
int N, M, prefix[NMAX];
vector < int > sol;

void Pref_Function()
{
    int pivot = 0;
    for(int i = 2; i <= M; i++)
    {
        while(pivot && pattern[pivot + 1] != pattern[i])
            pivot = prefix[pivot];
        if(pattern[pivot + 1] == pattern[i])
            pivot++;
        prefix[i] = pivot;
    }
}

void KMP()
{
    int pivot = 0;
    for(int i = 1; i <= N; i++)
    {
        while(pivot && pattern[pivot + 1] != original[i])
            pivot = prefix[pivot];
        if(pattern[pivot + 1] == original[i])
            pivot++;
        if(pivot == M)
            sol.push_back(i - M), pivot = prefix[pivot];
    }
}

void Print_Sol()
{
    out << sol.size() << "\n";
    int t = sol.size();
    for(unsigned i = 0; i < min(t, 1000); i++)
        out << sol[i] << " ";
}

void Read_Data()
{
    in >> pattern >> original;
    N = original.size(), M = pattern.size();
    original = ' ' + original, pattern = ' ' + pattern;
}

int main()
{
    Read_Data();
    Pref_Function();
    KMP();
    Print_Sol();
    return 0;
}