Cod sursa(job #3245949)

Utilizator AndreiSorin26012001Cirpici Andrei Sorin AndreiSorin26012001 Data 1 octombrie 2024 11:09:14
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#include <vector>

int main()
{
    std::ifstream in("strmatch.in");
    std::string needle; in >> needle;
    std::string haystack; in >> haystack;
    in.close();

    std::vector lsp(needle.size(), 0);

    for (int i = 1, j = 0; i < needle.size(); i++)
    {
        while (j > 0 && needle[i] != needle[j])
            j = lsp[j - 1];
        if (needle[i] == needle[j])
            j++;
        lsp[i] = j;
    }

    std::vector<int> occurenceIndexes;

    int i = 0, j = 0;
    while (i < haystack.size())
        if (haystack[i] == needle[j])
        {
            i++;
            j++;
            if (j == needle.size())
                occurenceIndexes.push_back(i - j);
        }
        else if (j == 0)
            i++;
        else
            j = lsp[j - 1];

    std::ofstream out("strmatch.out");
    out << occurenceIndexes.size() << '\n';
    unsigned long long n = std::min(occurenceIndexes.size(), 1000ull);
    for (int ii = 0; ii < n; ii++)
        out << occurenceIndexes[ii] << ' ';
    out.close();
    return 0;
}