Cod sursa(job #2589051)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 25 martie 2020 18:40:24
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

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

char p[2000001], t[2000001];
int f[2000001];
vector < int > poz;

int kmp(char p[], char t[], vector < int > &poz)
{
    int n, m, i, j, nr;
    n = strlen(t);
    m = strlen(p);
    nr = 0;

    f[0] = 0;
    for (i = 1; i<m && p[i] != p[0]; i++)
        f[i] = 0;

    for (j = i; j<m; j++)
        if (p[j] == p[f[j-1]])
            f[j] = f[j-1] + 1;
        else
            f[j] = 0;

    i = j = 0;
    while (i < n)
    {
        if (t[i] == p[j])
        {
            if (j == m - 1)
            {
               nr++;
               poz.push_back(i - m + 1);
               i++, j = f[j];
            }
            else
                i++, j++;
        }
        else if (j > 0)
            j = f[j-1];
        else
            i++;
    }

    return nr;
}

int main()
{
    fin >> p >> t;
    fout << kmp(p, t, poz) << "\n";
    for (int i=0; i<poz.size(); i++)
    {
        if (i == 1000)
            break;
        fout << poz[i] << " ";
    }
    return 0;
}