Cod sursa(job #2848123)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 12 februarie 2022 10:21:55
Problema Potrivirea sirurilor Scor 78
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <vector>

using namespace std;

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

string text, pattern;

int* prefixFunction(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[i] == s[k])
            k++;

        p[i] = k;
    }

    return p;
}

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

    int* p = prefixFunction(pattern);

    int k = 0;

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

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

        if (k == pattern.size())
        {
            ans.push_back(i - k + 1);
            k = p[k - 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;
}