Cod sursa(job #1291699)

Utilizator Alex_SimionSimion Alexandru Alex_Simion Data 13 decembrie 2014 09:56:54
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#define N 2000010
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
char a[N],b[N],*s;
int A,B,q,i,p[N],P[1010],np;
int main()
{
    s=a+1;f>>s;A=strlen(s);
    s=b+1;f>>s;B=strlen(s);
    //Pas 1. Constructia functiei prefix
    //p[i] = lungimea maxima a unui sufix pentru prefixul A[1]...A[i] care este prefic pentru A
    for(q=0,i=2;i<=A;i++)
    {
        while(q>0&&a[i]!=a[q+1])q=p[q];
        if(a[i]==a[q+1])q++;
        p[i]=q;
    }
    //Pas 2. gasim potriviri ( Algoritmul Knut - Mprris - Pratt sau KMP
    // Se gaseste cel mai lung sufix in B[1] .... B[i] care este prefix in A
    for(q=0,i=1;i<=B;i++)
    {
        while(q>0&&b[i]!=a[q+1])q=p[q];
        if(b[i]==a[q+1])q++;
        if(q==A)
        {
            np++;
            if(np<=1000)
                P[np]=i-q;
        }
    }
    g<<np<<'\n';
    np=min(np,1000);
    for(i=1;i<=np;i++)
        g<<P[i]<<' ';
    return 0;
}