Cod sursa(job #537106)

Utilizator andrei.finaruFinaru Andrei Emanuel andrei.finaru Data 20 februarie 2011 08:47:43
Problema Potrivirea sirurilor Scor 18
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<fstream.h>
#include<string.h>
ifstream f("strmatch.in");
ofstream g("strmatch.out");
char a[2000001], b[2000001];
int nr,p,na,nb,l[2000001],poz[1002],i,j;
int main()
{

f>>a>>b;na=strlen(a);nb=strlen(b);
     
// l[i]=x==> primele x (x<i) caractere ale sirului se gasesc la sfarsitul subsirului format cu primele i caractere
// exemplu -- daca a=a0a1a2a3......... si l[6]=3 => ca a0a1a2=a4a5a6
//                 

l[0]=-1;
j=-1; //primul caracter nu are inainte subsir
for(i = 1; i < na;i++) 
     { while(j >= 0 && a[i] != a[j]) j = l[j]; 
       j++;
       l[i]=j;	 
	 }
      
//g<<a<<'\n';
//for(i=0;i<na;i++) g<<l[i];
//g<<'\n';

	 
j=0;
for(i=0;i<nb;i++)
{ while(j >= 0 && a[j] != b[i]) j=l[j];
  j++;
  if(j==na) 
	  {j=l[na-1];
       nr++;
	   if(nr<=1000)poz[nr]=i-na+1;
	  }
}
	

g<<nr<<'\n';
if(nr>1000) nr=1000;
for(i=1;i<=nr;i++) g<<poz[i]<<' ';
g<<'\n';
	f.close(); g.close();
	return 0;
}