Cod sursa(job #2289861)

Utilizator sebastiannrxRichiteanu Mihai Sebastian sebastiannrx Data 25 noiembrie 2018 14:03:15
Problema Abc2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream f("abc2.in");
ofstream g("abc2.out");
const unsigned int MaxN=10111000;
const unsigned int MaxL=50;
const unsigned int MaxK=66111;
char str[MaxN],cuv[MaxL];
unsigned int N,L,sol,cpow,cod,C[MaxK],K,tstep,F[MaxL];
inline unsigned int get(unsigned int key)
{
	int first=0;
	int M=tstep;
	while(M>0)
	{
		unsigned int index=first+F[M];
		if(index>K || key<C[index])
		{
			--M;
		}
		else if(key==C[index])
		{
			return true;
		}
		else
		{
			M-=2;
			first=index;
		}
	}
	return false;
}

int main()
{
	f.getline(str,sizeof(str));
	N=strlen(str);

	K=0;
	while(f.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';
			cuv[i]=0;
		}
		C[++K]=cod;
	}
	f.close();
	sort(C+1,C+1+K);

	F[1]=1;
	unsigned int i;
	for(i=2;F[i-1]<K;++i)
	{
		F[i]=F[i-1]+F[i-2];
	}
	tstep=i-1;

	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);
	}

	g<<sol;
	return 0;
}