Cod sursa(job #1201302)

Utilizator adrianbercaBerca Adrian adrianberca Data 24 iunie 2014 19:56:01
Problema Potrivirea sirurilor Scor 16
Compilator c Status done
Runda Arhiva educationala Marime 2.27 kb
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
FILE *f,*g;
char sir[2000003],subsir[2000003];
int pozitii[10001];
int main()
{
    f=fopen("strmatch.in","r");
    g=fopen("strmatch.out","w");
    int i,j,n1,n2,k;
    i = 0; j = 0; n1 = 0; n2 = 0; ; k = 0;
    while(fscanf(f,"%c",&subsir[j])==1)
    {
      if(subsir[j] == '\n')
          break;
      else  j++;
    }
    n2 = j;
      while(fscanf(f,"%c",&sir[i])==1)
    {
        if(sir[i] == '\0')
            sir[i] = '\n';
     if(sir[i] == '\n')
        break;
     else   i++;
    }
    n1 = i;

    j = 0;
        for( i = 0 ;i <= n1 ;)
        {
             if(sir[i] == subsir[j])
               {
                   i++;
                   j++;
               }
            else //daca 2 elementel nu se potrivesc in sir se trece la pozitia urmatoare iar subsirul porneste de la inceput
                {
                i++;
                j = 0;
                 }
             if(subsir[j] == '\n')//daca s-a gasit o slutie , subsirul porneste de la inceput iar sirul creste in continuare
             {
                 if(k<1000)
                 pozitii[k] = i-n2;
                 k++;
                 if (j>=2)
                    i = i - n2;
                 else
                    i = i - 1;
             }

        }


/*
    j = 0;
    for(i = 0 ; i <=n1 ;i++)
    {
        for(j; j <= n2 ; j++)
        {
            if(subsir[j]== '\n')
                {
                    pozitii[k] = i-n2;
                    k++;
                    if(n2 >= 2)
                         i -=2;//pt ca i-ul crese odata inainte sa ajunga aici si mai creste odata dupa ce face break
                    else i -=1;
                    j = 0;
                    break;
                }
            if(sir[i]==subsir[j])
            {
              j++;
              break;
            }
            else
            {
                j = 0;//subsirul incepe de la 0 daca nu sunt egala
                break;//o sa iese din for-ul pt j si o  sa creasca i-ul
            }
        }
    }
*/
fprintf(g,"%d\n",k);
for(i = 0 ; i < k ; i++)
{
 if (i >= 1000)
    break;
    fprintf(g,"%d\t",pozitii[i]);
}
    fclose(f);
    fclose(g);
    return 0;
}