Cod sursa(job #418072)

Utilizator feelshiftFeelshift feelshift Data 15 martie 2010 13:16:30
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <cstdio>
#include <cstring>

int lungime,total,k,dict = -1,count,tmp;
char string[10000001],subsir[21],c;

typedef char cuvinte[21];
cuvinte dictionar[50001];

FILE * in = fopen("abc2.in","rt");
FILE * out = fopen("abc2.out","wt");

int check(int k);

int main()
{
	int i;
	
	total = -1;
	
	while(c != '\n')
	{
		fscanf(in,"%c",&c);
		string[++total] = c;
	}
	
	total = 0;
	
	fscanf(in,"%c",&c);	// pentru caracterul \n
	fscanf(in,"%c",&c);	// pentru prima litera ca sa intre in while (line 29)
	
	lungime = strlen(string);
	
	while(!feof(in))
	{
		//fscanf(in,"%s",subsir);
		
		while(c != '\n' && !feof(in))
		{
			subsir[++dict] = c;
			fscanf(in,"%c",&c);
		}
		
		for(i=1;i<=total;i++)
			if(!strcmp(subsir,dictionar[i]))
				tmp = 1;
		
		if(!tmp)	// daca e un cuvant nou in dictionar
			strcpy(dictionar[++total],subsir);
		
		dict = -1;
		fscanf(in,"%c",&c);	// ca sa intre in while (line 29)
	}
	dict = strlen(dictionar[1]);
	
	/*printf("%s\n",string);
	
	for(i=1;i<=total;i++)
		printf("%s\n",dictionar[i]);*/
	
	lungime-=dict;
	
	for(i=0;i<=lungime;i++)
		count+=check(i);
	
	fprintf(out,"%d",count);
	
	return (0);
}

int check(int k)
{
	int e,i,t,answer = 0,pozitie = -1;
	
	t = k + dict;
	
	//for(e=k;e<i;e++)
		//subsir[e-k] = string[e];
	//printf("%s\n",subsir);
	
	for(e=1;e<=total;e++)
		for(i=k;i<t;i++)
		{
			if(string[i] != dictionar[e][++pozitie])
			{
				pozitie = -1;
				break;
			}
			
			if(i == t - 1)
				answer++;
		}
	
	//memset(subsir,0,dict);
	
	return answer;
}