Cod sursa(job #3197328)

Utilizator VladLuncanLuncan Vlad VladLuncan Data 26 ianuarie 2024 15:58:25
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>

using namespace std;

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

string pat, s;
vector<int> foundAt;

void read()
{
    getline(fin, pat);
    getline(fin, s);
}

void preCompute(int lps[], int m)
{
    int cnt = 0, i = 1;
    lps[0] = 0;

    while(i < m)
    {
        if (pat[i] == pat[cnt])
        {
            cnt++;
            lps[i] = cnt;
            i++;
        }
        else
        {
            if (cnt != 0)
                cnt = lps[cnt - 1];
            else
            {
                lps[i] = 0;
                i++;
            }
        }
    }
}

void found_kmp()
{
    int n = s.size(), m = pat.size();
    int lps[m + 1] = {}, cnt = 0;

    preCompute(lps, m);

    int i = 0, j = 0;

    while ((n - i) >= (m - j))
    {
        if (pat[j] == s[i])
        {
            i++;
            j++;
        }

        if (j == m)
        {
            foundAt.push_back(i - j);
            j = lps[j - 1];
        }
        else if (i < n && pat[j] != s[i])
        {
            if (j != 0)
                j = lps[j - 1];
            else
                i++;
        }
    }
}

int main()
{
    read();
    found_kmp();

    fout << foundAt.size() << '\n';

    int len = foundAt.size();
    if (len > 1000)
        len = 1000;

    for (int i = 0; i < len; ++i)
        fout << el[i] << ' ';

    return 0;
}