Cod sursa(job #582412)

Utilizator SadmannCornigeanu Calin Sadmann Data 15 aprilie 2011 12:42:07
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<fstream>
#include<cstring>
#define NMAX 2000005
using namespace std;

char A[NMAX],B[NMAX];
int NA,NB;
int poz[1020];
int pi[NMAX];

inline void make_prefix()
{
    int q=0;
    for(int i=2;i<=NA;i++)
    {
        while(q && A[q+1]!=A[i])
            q=pi[q];
        if(A[q+1]==A[i])
            q++;
        pi[i]=q;
    }
}

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

int main()
{
    in>>A+1>>B+1;
    NA=strlen(A+1);
    NB=strlen(B+1);
    make_prefix();
    int q=0,nr=0;
    for(int i=1;i<=NB;i++)
    {
        while(q && A[q+1]!=B[i])
            q=pi[q];
        if(A[q+1]==B[i])
            q++;
        if(q==NA)
        {
            q=pi[NA];
            ++nr;
            if(nr<=1000)
                poz[nr]=i-NA;
        }
    }
    out<<nr<<"\n";
    int aux=(nr<=1000)? nr:1000;
    for(int i=1;i<=aux;i++)
    out<<poz[i]<<" ";
    return 0;
}