Cod sursa(job #2176254)

Utilizator mihnea00Duican Mihnea mihnea00 Data 16 martie 2018 21:56:44
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

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

int i,j,tab[2000010],idx,lp,lt;
char text[2000010],patern[2000010];
vector<int> lst;

void repere_in_patern()
{
    idx=0;
    i=1;

    while(i<lp)
    {
        if(patern[i]==patern[idx])
        {
            ++idx;
            tab[i]=idx;
            ++i;
        }
        else
        {
            if(idx!=0)
            {
                idx=tab[idx-1];
            }
            else
            {
                tab[i]=0;
                ++i;
            }
        }
    }
}

void KMP()
{
    i=0;
    j=0;

    while(i<lt)
    {
        if(text[i]==patern[j])
        {
            ++i;
            ++j;
        }
        if(j==lp)
        {
            lst.push_back(i-j);
            //++nr;
            j=tab[j-1];
        }
        else if(i<lt && text[i]!=patern[j])
        {
            if(j!=0)
                j=tab[j-1];
            else
                ++i;
        }
    }
}

int main()
{
    fin>>patern>>text;
    lt=strlen(text);
    lp=strlen(patern);

    repere_in_patern();
    KMP();

    idx=lst.size();
    idx=min(idx,1000);

    fout<<lst.size()<<"\n";
    for(i=0;i<idx;++i)
        fout<<lst[i]<<" ";
    return 0;
}