Cod sursa(job #2391435)

Utilizator SmokeCiocotisan Cosmin Smoke Data 28 martie 2019 20:50:04
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <cstring>


#define Nmax 200000

using namespace std;

void make_prefix(char A[] , int pi[], int lungA)
{
    int i, q =0;

    for( i = 2 , pi[1] = 0; i <= lungA ; i++)
          {
              while(q && A[q+1] !=  A[i])
                    q = pi[q];

              if(A[q+1] == A[i])
                q++;

              pi[i] = q;

          }

}

int main()
{
    char A[Nmax];
    char B[Nmax];
    int pi[Nmax] , pos[1024];

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

    in.getline(A,Nmax);
    in.getline(B, Nmax);
    cout<<A<<endl<<B<<endl;

     int lungA = strlen(A);
     int lungB = strlen(B);


    for(int i = lungA ; i > 0 ; i--)
         A[i] = A[i-1];

    for(int j = lungB ; j > 0 ; j--)
          B[j]= B[j-1];

    A[0]=' ';
    B[0]=' ';

    make_prefix(A , pi, lungA );
    int q = 0,n=0;

    for(int i = 1 ;i <= lungB ; i++)
    {
        while(q && A[q+1] != B[i])
             q= pi[q];

             if(A[q+1] == B[i])
                 q++;

             if(q == lungA)
             {
                 q = pi[lungA];
                 pos[++n] = i - lungA;

             }

    }

    for(int i = 1 ;i<=n ;i++)
         out<<pos[i]<<" ";



    return 0;
}