Cod sursa(job #2366265)

Utilizator CodrinsahCotarlan Codrin Codrinsah Data 4 martie 2019 19:16:40
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>

using namespace std;
ifstream fi ("kmp.in");
ofstream fo ("kmp.out");
string cuv,sir;
int pref[2000006],sol[2000006];
int nrsol;
void precalc()
{
    int pozcuv,pozpref;
    pref[0]=-1;
    pozpref=-1;
    for (pozcuv=1;pozcuv<cuv.size();pozcuv++)
    {
        while (pozpref>=0 and cuv[pozcuv]!=cuv[pozpref+1]) pozpref=pref[pozpref];
        if (cuv[pozcuv]==cuv[pozpref+1]) pozpref++;
        pref[pozcuv]=pozpref;
    }
}
int main()
{
    fi>>cuv>>sir;
    precalc();
//    for (int i=0;i<cuv.size();i++) fo<<pref[i];
    int pozcuv=-1;
    for (int pozsir=0;pozsir<sir.size();pozsir++)
    {
        while (pozcuv>=0 and cuv[pozcuv+1]!=sir[pozsir]) pozcuv=pref[pozcuv];
        if (sir[pozsir]==cuv[pozcuv+1]) pozcuv++;
        if (pozcuv==cuv.size()-1) {nrsol++;sol[nrsol]=pozsir-pozcuv;pozcuv=pref[pozcuv];}
    }
    for (int i=1;i<=min(nrsol,1000);i++) fo<<sol[i]<<' ';
    return 0;
}