Cod sursa(job #1739514)

Utilizator castle2145Popa Catalin castle2145 Data 9 august 2016 16:29:31
Problema Potrivirea sirurilor Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
/*
Algoritm_potrivire_KMP

m <- lungime(M), n <- lungime(N)
q <- 0
pt i <- 1, m
    cat timp (q > 0) si (N[q + 1] != M[i])
        q <- pi[q]
    daca N[q + 1] = M[i]
        q <- q + 1
    daca q = n
        scrie "potrivire la pozitia " i - n + 1
*/

#include <cstdio>
#include <fstream>
#include <iostream>
#define LMAX 2000002

using namespace std;

char N[LMAX], M[LMAX];
int pi[LMAX];
int pozitii[1001], poz;

FILE *f=fopen("strmatch.in","r");
ofstream fout ("strmatch.out");

int main()
{
    int n=0, m=0;
    N[0]='0';
    char c='\0';
    while(!feof(f) && c !='\n')
    {
        fscanf(f,"%c",&c);
        N[++n]=c;
    }
    N[n]='\0';

    M[0]='0';
    fscanf(f,"%c",&c);
    while(!feof(f) && c !='\n')
    {
        M[++m]=c;
        fscanf(f,"%c",&c);
    }
    M[++m]=c;
    m--;

    int k, i;
    k=0;
    pi[1]=0;
    for(i=2; i<=n; i++)
    {
        while(k>0 && N[k+1]!=N[i])
            k=pi[k];
        if(N[k+1]==N[i])
            k++;
        pi[i]=k;
    }

    int q=0;
    for(i=1; i<=m; i++)
    {
        while(q>0 && N[q+1]!=M[i])
            q=pi[q];
        if(N[q+1]==M[i])
            q++;
        if(q==n-1)
        {
            ++poz;
            if(poz<=1000)
            pozitii[poz]=i-n+1;
        }
    }

    fout<<poz<<'\n';
    if(poz>1000)
        poz=1000;
    for(i=1;i<=poz;i++)
        fout<<pozitii[i]<<' ';

    fclose(f);
    fout.close();

    return 0;
}