Cod sursa(job #1370181)

Utilizator DarianCDarian Craciun DarianC Data 3 martie 2015 13:20:28
Problema Potrivirea sirurilor Scor 36
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<fstream>
#include<string.h>
#define nmax 2000005
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
int n,m,contor,urm[nmax],pozitie_aparitie[nmax];
char P[nmax],T[nmax];

void Prefix()
{
    int q, k=0;
    n=strlen(T); m=strlen(P);
    urm[1] = 0;
    for(q = 2; q < m; q++)
    {
        while(k>0 && P[k+1]!=P[q]) k=urm[q];
        if(P[k+1]==P[q]) k++;
        urm[q]=k;
    }
}

void KMP()
{
    int i,q=0;
    for(i = 1; i < n; i++)
    {
        while(q>0 && P[q+1]!=T[i]) q=urm[q];
        if(P[q+1]==T[i]) q++;
        if(q==m-1) { contor++; pozitie_aparitie[contor] = i-m+1; }
    }
}

void Afisare()
{
    fout<<contor<<'\n';
    for(int i=1;i<=contor&&i<=1000;i++)
        fout<<pozitie_aparitie[i]<<' ';
    fout<<'\n';
    fout.close();
}
int main()
{
    fin.getline(P,sizeof(P));
    fin.getline(T,sizeof(T));
    fin.close();
    Prefix();
    KMP();
    Afisare();
    return 0;
}