Cod sursa(job #169687)

Utilizator g3ppyStoian Vlad g3ppy Data 1 aprilie 2008 21:11:05
Problema Potrivirea sirurilor Scor 18
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#include <string.h>
#define minim(a, b) ((a < b) ? a : b)  
#define NM 2000002
char N[NM],M[NM],a[3];
char pi[NM];
FILE *f,*g,*f2,*g2;

int main()

{
int k,n,i,m,q;
long nr=1,x;

f=fopen("strmatch.in","rt");
g=fopen("str2.out","wt");

fgets(N+1,NM,f);
fgets(a,2,f);
fgets(M+1,NM,f);

n = strlen(N+1);
N[n]=0;
n--;
k = 0;
pi[1] = 0;
for (i = 2; i <= n; i++)
    {
    while (k>0 && N[k+1]!=N[i])
	  k=pi[k];
    if (N[k+1]==N[i])
       k++;
    pi[i]=k;
    }


m = strlen(M+1); n = strlen(N+1);
q = 0;

for (i=1; i<=m; i++)
    {
    while (q > 0 && N[q+1] != M[i])
	 q = pi[q];
    if (N[q+1] == M[i])
	 q++;
    if (q==n)
       {
       fprintf(g,"%d ",i-n+1);
       nr++;
       }

    }
fclose(f);
fclose(g);

f2=fopen("str2.out","rt");
g2=fopen("strmatch.out","wt");


fprintf(g2,"%ld\n",nr-1);
for (i=1;i<=minim(nr-1,1000);i++)
    {
    fscanf(f2,"%ld",&x);
    fprintf(g2,"%ld ",x);
    }
fclose(f2);
fclose(g2);

return 0;
}