Cod sursa(job #1452319)

Utilizator petru.cehanCehan Petru petru.cehan Data 20 iunie 2015 16:02:02
Problema Potrivirea sirurilor Scor 18
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <string.h>
#include <fstream>
#define NMAX 2000000
#define minim ((1000>N) ? N : 1000)

using namespace std;

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

char A[NMAX],B[NMAX];
int f[NMAX],sol[NMAX],i,j,k,N;

void Citire()
{
    fin.getline(A,NMAX);
    fin.getline(B,NMAX);
}

void FAILURE(char A[NMAX])
{
  int k,lgA=strlen(A);
  k=0;
  f[1]=0;
  for(j=2;j<=lgA;++j)
      {
          while(k>0 && A[j]!=A[k+1])
                 k=f[k];
          if(A[k+1]==A[j])
              ++k;
          f[j]=k;
      }
  for(i=0;i<lgA;++i)
      cout<<f[i]<<" ";
}
void KMP(char A[NMAX], char B[NMAX])
{
    i=1;
    j=0;
    int lgA=strlen(A),lgB=strlen(B);
    while(i<=lgB)
        {
            while(j>0 && A[j+1]!=B[i])
                    j=f[j];
            if(A[j+1]==B[i])
               ++j;
            if(j==lgA-1)
                sol[N]=i-lgA+1,j=0,++N;
            ++i;

        }
}
int main()
{
    Citire();
    FAILURE(A);
    KMP(A,B);
    fout<<N<<"\n";
    for(i=0;i<minim;++i)
         fout<<sol[i]<<" ";
    return 0;
}