Cod sursa(job #103295)

Utilizator damaDamaschin Mihai dama Data 15 noiembrie 2007 11:07:25
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.57 kb
#include <stdio.h>
#include <string.h>
#include <ctype.h>

const int lenmax = 10000010;
const int modul1 = 1000183;
const int modul2 = 1003397;
const int modul3 = 1010509;
const int modul4 = 1030031;

char line[lenmax], cuv[24];
int v1[modul1], v2[modul2], v3[modul3], v4[modul4];

int min(int a, int b)
{
	if(a < b)
	{
		return a;
	}
	return b;
}

unsigned int conv(char* c, int l)
{
	unsigned int res = 0;
	int i;

	for(i = 0; i < l; ++i)
	{
		res = 3 * res + c[i] - 'a';
	}
	return res;
}


int main()
{
	freopen("abc2.in", "r", stdin);
	freopen("abc2.out", "w", stdout);

	int i, sol = 0, len, l, j;
	unsigned int aux = 0, temp, t = 1;

	fgets(line, lenmax, stdin);
	len = strlen(line) - 1;
	while(!isalpha(line[len - 1]))
	{
		--len;
	}
	fgets(cuv, 24, stdin);
	l = strlen(cuv) - 1;

	for(i = 1; i < l; ++i)
	{
		t *= 3;
	}
//	printf("%d\n", t);
	
	for(i = 0; i < l; ++i)
	{
		aux = 3 * aux + line[i] - 'a';
	}
	//printf("%d\n", aux);
	++v1[aux % modul1];
	++v2[aux % modul2];
	++v3[aux % modul3];
	++v4[aux % modul4];

	for(i = l; i < len; ++i)
	{
		aux = (aux - t * (line[i - l] - 'a')) * 3 + line[i] - 'a';
		//printf("%d\n", aux);
		++v1[aux % modul1];
		++v2[aux % modul2];
		++v3[aux % modul3];
		++v4[aux % modul4];
	}
	//printf("\n");

	do
	{
		temp = conv(cuv, l);
		//printf("%d\n", temp);
		j = min(min(v1[temp % modul1], v2[temp % modul2]), min(v3[temp % modul3], v4[temp % modul4]));
		sol += j;
		v1[temp % modul1] -= j;
		v2[temp % modul2] -= j;
		v3[temp % modul3] -= j;
		v4[temp % modul4] -= j;
		fgets(cuv, 24, stdin);
	}
	while(!feof(stdin));

	printf("%d\n", sol);

	return 0;
}