Cod sursa(job #2195494)

Utilizator AgacheGabrielAgache Gabriel AgacheGabriel Data 16 aprilie 2018 15:47:03
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define NMAX 2000010

using namespace std;

char pat[NMAX],text[NMAX];

int fai[NMAX],nrSol,sol[1001];

FILE *fin,*fout;

int mini(int a,int b)
{
    return a<b ? a:b;
}

void read()
{
    fin = fopen("strmatch.in","r");
    fout = fopen("strmatch.out","w");
    fscanf(fin,"%s",pat);
    fscanf(fin,"%s",text);
}

void calcFai(char* pat)
{
    fai[0] = -1;
    fai[1] = 0;
    int len = strlen(pat);
    int j = 0;
    for (int i = 2; i<=len ;i++)
    {
        while (j>0 && pat[i-1]!=pat[j]) j = fai[j];
        if (pat[i-1] == pat[j]) j++;
        fai[i] = j;
    }
}

void KMP()
{
    int n = strlen(text);
    int m = strlen(pat);
    int i = 0;
    int j = 0;
    while (i<n)
    {
        if (pat[j] == text[i]) {i++;j++;}
        if (j == m)
        {
            nrSol++;
            if (nrSol<=1000)
                sol[nrSol] = i-j;
            j = fai[j];
        }
        else if (i<n && pat[j]!=text[i])
        {
            if (j==0) i++;
            else j = fai[j];
        }
    }
}

int main()
{
    read();
    calcFai(pat);
    KMP();
    fprintf(fout,"%d\n",nrSol);
    for (int i = 1; i<=mini(1000,nrSol) ; i++)
        fprintf(fout,"%d ",sol[i]);
    fprintf(fout,"\n");
    fclose(fin);
    fclose(fout);
    return 0;
}