Cod sursa(job #350751)

Utilizator bog29Antohi Bogdan bog29 Data 25 septembrie 2009 19:11:30
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include<fstream>
#define dmax 2000003
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
char t[dmax],p[dmax];
long int n,m,urm[dmax];
void geturm()
{	long int i,k=-1;
	urm[0]=0;
	for(i=1;i<m;i++)
	{	while(k>0 && p[k+1]!=p[i])
			k=urm[k];
		if(p[k+1]==p[i])
			k++;
		urm[i]=k;
	}	
}
void solve(int k)
{	long int i,x=-1,nr=0;
	for(i=0;i<n;i++)
	{	while(x>0 && t[i]!=p[x+1])
			x=urm[x];
		if(t[i]==p[x+1])
			x++;
		if(x==m-1)
		{	nr++;
			if(k==1 && nr<=1000)
				out<<i-m+1<<" ";
			x=urm[x];
		}
	}
	if(k==0)
		out<<nr<<'\n';
}
int main()
{	long int i,x=-1;
	in.getline(p,dmax,'\n');
	in.getline(t,dmax,'\n');
	in.close();
	n=strlen(t);
	m=strlen(p);
	geturm();
	solve(0);
	solve(1);
	out.close();
	return 0;
}