Cod sursa(job #470703)

Utilizator bog29Antohi Bogdan bog29 Data 15 iulie 2010 12:46:52
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<fstream>
#include<vector>
#include<math.h>
#define dmax 10000004
#define dmax2 50004
#define md 666013
#define bz 3

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

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

vector<int>g[md];
vector<int>::iterator it;


void geth(int k)
{	long long nr=0,n,i,ok=1;
	n=strlen(cuv[k]);
	for(i=0;i<n;i++)
	{	nr+=( (int)pow(bz,n-i-1) * (cuv[k][i]-'a') % md );
		if(nr >= md)
			nr%=md;
	}	
	for(it=g[nr].begin();it<g[nr].end();it++)
		if(!strcmp(cuv[k],cuv[*it]))
			ok=0;
	if(ok)
		g[nr].push_back(k);
}

void comp(long long p1,int k)
{	int i,ok=1;
	
	for(i=0;i<m;i++)
		if(l[p1+i] != cuv[k][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;
	}
	if(!g[h].empty() )
		for(it=g[h].begin();it<g[h].end();it++)	
			comp(0,*it);
	
	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;
		if(!g[h].empty() )
			for(it=g[h].begin();it<g[h].end();it++)	
				comp(i,*it);
	}	
}	

int main()
{	int i;
	in.getline(l,dmax,'\n');
	while(!in.eof() )
	{	nr++;
		in.getline(cuv[nr],23,'\n');
		geth(nr);
	}
	in.close();
	m=strlen(cuv[0]);
	search();
	out<<sol;
	out.close();
	return 0;
}