Cod sursa(job #2091195)

Utilizator FredyLup Lucia Fredy Data 19 decembrie 2017 11:50:12
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <iostream>
#include <string.h>
#include <fstream>
#include <vector>

using namespace std;

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

#define lim 2000010
char text[lim], pattern[lim];
int pf[lim],n,m,c;
vector <int> sol;

void prefix_function()
{
    int k;
    for (int i=2; i<=n; i++)
    {
        k=pf[i-1];
        while (k && pattern[i]!=pattern[k+1])   k=pf[k];
        if (pattern[i] == pattern[k+1]) k++;
        pf[i]=k;
    }
}

int main()
{
    fin>>(pattern+1)>>(text+1);
    n = strlen (pattern+1);
    m = strlen (text+1);
    prefix_function ();

    int k=0;
    for (int i=1; i<=m; i++)
    {
        while (k && pattern[k+1]!=text[i])  k=pf[k];
        if (pattern[k+1]==text[i])  k++;
        if (k==n)
            sol.emplace_back (i-k);
    }

    int nr=0;
    fout<<sol.size()<<'\n';
    for (auto it:sol)
    {
        fout<<it<<' ';
        if (++nr==1000)
            break;
    }

    return 0;
}