Cod sursa(job #470384)

Utilizator bog29Antohi Bogdan bog29 Data 13 iulie 2010 16:21:22
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<math.h>
#define dmax 10000004
#define dmax2 50004
#define md 150151
#define bz 3

using namespace std;
ifstream in("abc2.in");
ofstream out("abc2.out");

char l[dmax];
int nr=-1,m;
long long sol;

struct c
{	char t[23];
	int hsh;
}	cuv[dmax2];	

typedef int (*compfn)(const void *, const void *);

int sf(struct c *a, struct c *b)
{	return a->hsh - b->hsh;
}

void geth(int k)
{	long long nr=0,n,i;
	n=strlen(cuv[k].t);
	for(i=0;i<n;i++)
	{	nr+=( (int)pow(bz,n-i-1) * (cuv[k].t[i]-'a') % md );
		if(nr >= md)
			nr%=md;
	}	
	cuv[k].hsh=nr;
	//out<<cuv[k].hsh<<'\n';
}

int bs(int v)
{	int l,r,m;
	l=0;
	r=nr+1;
	while(l <= r)
	{	m=(l+r)/2;
		if(cuv[m].hsh == v)
			return m;
		else if(cuv[m].hsh < v)
			l=m+1;
		else if(cuv[m].hsh > v)
			r=m-1;
	}
	return -1;
}

void comp(long long p1,int k)
{	int i,ok=1;
	
	for(i=0;i<m;i++)
		if(l[p1+i] != cuv[k].t[i])
			ok=0;
	if(ok)
	{	sol++;
		//out<<"*"<<p1<<" "<<k<<" "<<"*\n";
	}	
}	
	
void search()
{	int p,r;
	long long i,lng,h=0,f;
	f=(long long)pow(bz,m-1) % md;
	for(i=0;i<m;i++)
	{	h=(bz*h + (l[i]-'a') ) %md;
		if(h > md)
			h%=md;
	}
	
	p=bs(h);
	r=p+1;
	while(cuv[p].hsh == h && p!=-1)
	{	comp(0,p);
		p--;
	}	
	while(cuv[r].hsh == h && r!=-1)
	{	comp(0,r);
		r++;
	}	
	lng=strlen(l);
	for(i=1;i <= lng-m ;i++)
	{	h= (h + bz*md - f * (l[i-1]-'a'))%md ;
		h= (h*bz + ( l[i+m-1]-'a' ) )%md;
		if(h < 0)
			h+=md;
		if(h > md)
			h%=md;
		p=bs(h);
		r=p+1;
		while(cuv[p].hsh == h && p!=-1)
		{	comp(i,p);
			p--;
		}	
		while(cuv[r].hsh == h && r!=0)
		{	comp(i,r);
			r++;
		}	
	}	
}	

int main()
{	int i;
	in>>l;
	while(!in.eof() )
	{	nr++;
		in>>cuv[nr].t;
		geth(nr);
	}
	in.close();
	qsort( (void*)&cuv , nr+1 , sizeof(struct c), (compfn)sf );
	/*for(i=0;i<=nr;i++)
		out<<cuv[i].t<<" "<<cuv[i].hsh<<'\n';
	out<<'\n';*/
	m=strlen(cuv[0].t);
	search();
	out<<sol;
	out.close();
	return 0;
}