Cod sursa(job #2733123)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 29 martie 2021 22:49:52
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <vector>

using namespace std;

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

string text, pattern;

int* calcPrefixFunction(const string &s)
{
    int* p = new int[s.size()];

    p[0] = 0;

    int k = 0;

    for (int i = 1; i < s.size(); i++)
    {
        while (k > 0 && s[i] != s[k])
            k = p[k - 1];

        if (s[k] == s[i])
            k++;

        p[i] = k;
    }

    return p;
}

vector < int > KMP(const string &text, const string &pattern)
{
    vector < int > ans;

    int* p = calcPrefixFunction(pattern);

    int maxPrefixLenght = 0;

    for (int i = 0; i < text.size(); i++)
    {
        while (maxPrefixLenght > 0 && text[i] != pattern[maxPrefixLenght])
            maxPrefixLenght = p[maxPrefixLenght - 1];

        if (pattern[maxPrefixLenght] == text[i])
            maxPrefixLenght++;

        if (maxPrefixLenght == pattern.size())
        {
            int index = i - pattern.size() + 1;
            ans.push_back(index);

            maxPrefixLenght = p[maxPrefixLenght - 1];
        }
    }

    delete[] p;

    return ans;
}

int main()
{
    f >> pattern >> text;

    vector < int > ans = KMP(text, pattern);

    g << ans.size() << "\n";
    for (int i = 0; i < ans.size() && i < 1000; i++)
        g << ans[i] << " ";

    return 0;
}