Cod sursa(job #2455644)

Utilizator DavidLDavid Lauran DavidL Data 12 septembrie 2019 10:49:02
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fi("strmatch.in");
ofstream fo("strmatch.out");

const int NMAX = 2e6 + 5;

int n, m;
char A[NMAX], pat[NMAX];
int lsp[NMAX];
vector <int> rez;

void getLsp()
{
    lsp[1] = 0;

    for (int i = 2; i <= m; i++)
    {
        int l = lsp[i - 1];
        while (l > 0 && pat[i] != pat[l + 1])
            l = lsp[l];
        if (pat[i] == pat[l + 1])
            l++;
        lsp[i] = l;
    }
}

void getKmp()
{
    int j = 1, i = 1;
    while (i <= n)
    {
        if (pat[j] == A[i])
        {
            if (j == m)
            {
                rez.push_back(i - m);

                j = lsp[j] + 1;
                i++;
            }
            else
            {
                j++;
                i++;
            }
        }
        else
        {
            while (j > 1 && pat[j] != A[i])
            {
                j = lsp[j - 1] + 1;
            }
            if (pat[j] != A[i])
                i++;
        }
    }
}

int main()
{
    fi >> pat + 1 >> A + 1;
    n = strlen(A + 1);
    m = strlen(pat + 1);

    getLsp();

    //for (int i = 1; i <= m; i++)
        //cout << lsp[i] << " ";

    getKmp();

    fo << rez.size() << "\n";
    for (auto x: rez)
        fo << x << " ";

    return 0;
}