Cod sursa(job #552345)

Utilizator GrimpowRadu Andrei Grimpow Data 12 martie 2011 09:51:21
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
    #include<iostream.h>
    #include<fstream.h>
    #include<string.h>
    #include<stdio.h>
     

     
    void prefix(char *N,int *pi)
    {
        int n,k,i;
        n=strlen(N);
        k=0;
        pi[0]=0;
        for(i=1;i<n;i++)
        {
          while(k>0&& N[k]!=N[i])
            k=pi[k-1];
           if(N[k]==N[i])
         k++;
           pi[i]=k;
           }
    }
    
    int main()
    {
      char *N = new char[2000001];
      char *M = new char[2000001];
      int *pi = new int[2000000];
      int i=0,n,m,q,a[1000],t,s;
       
      char c;

      FILE *f = fopen("strmatch.in","rt");
      fscanf(f,"%s%s",N,M);
      fclose(f);
      prefix(N,pi);
    /*  FILE *g = fopen("strmatch.out","wt");
      fprintf(g,"%s\n%s",N,M);
      fclose(g);*/
       t=s=0;
       m=strlen(M);
       n=strlen(N);
      q=0;
      ofstream g("strmatch.out");
      for(i=0;i<m;i++)
         {
     
          while(q>0 && N[q]!=M[i])
             q=pi[q-1];
          if(N[q]==M[i])
             q++;
          if(q==n&&t<1000) {a[t]=i-n+1; t++; s++;}
          if(q==n&&t>999) s++;
         }
       g<<s<<'\n';
       for(i=0;i<t;i++)
          g<<a[i]<<" ";
       g.close();
       return 0;   
    }