Cod sursa(job #530975)

Utilizator ChallengeMurtaza Alexandru Challenge Data 8 februarie 2011 18:54:50
Problema Abc2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

const char InFile[]="abc2.in";
const char OutFile[]="abc2.out";
const unsigned int MaxN=10111000;
const unsigned int MaxL=50;
const unsigned int MOD=666013;

ifstream fin(InFile);
ofstream fout(OutFile);

char str[MaxN],cuv[MaxL];
unsigned int N,L,sol,cpow,cod;
vector<unsigned int> H[MOD];

inline void add(unsigned int key)
{
	unsigned int hash=key%MOD;
	vector<unsigned int>::iterator it;
	for(it=H[hash].begin();it!=H[hash].end();++it)
	{
		if(*it==key)
		{
			return;
		}
	}
	H[hash].push_back(key);
}

inline unsigned int get(unsigned int key)
{
	unsigned int hash=key%MOD;
	vector<unsigned int>::iterator it;
	for(it=H[hash].begin();it!=H[hash].end();++it)
	{
		if(*it==key)
		{
			return 1;
		}
	}
	return 0;
}

int main()
{
	fin.getline(str,sizeof(str));
	N=strlen(str);
	
	while(fin.getline(cuv,sizeof(cuv)))
	{
		if(L==0)
		{
			L=strlen(cuv);
		}

		cod=0;
		for(register unsigned int i=0;i<L;++i)
		{
			cod*=3;
			cod+=cuv[i]-'a';
		}
		add(cod);
		memset(cuv,0,sizeof(cuv));
	}
	fin.close();

	cpow=1;
	for(register unsigned int i=1;i<L;++i)
	{
		cpow*=3;
	}

	cod=0;
	for(register unsigned int i=0;i<L;++i)
	{
		str[i]-='a';
		cod*=3;
		cod+=str[i];
	}
	sol+=get(cod);

	for(register unsigned int i=L;i<N;++i)
	{
		str[i]-='a';
		cod-=cpow*str[i-L];
		cod*=3;
		cod+=str[i];
		sol+=get(cod);
	}

	fout<<sol;
	fout.close();
	return 0;
}