Cod sursa(job #106714)

Utilizator beluadas afsaq belu Data 18 noiembrie 2007 21:54:23
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.96 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *f,*g;
char a[10000001];
long n,sol;
int w,ok1;
char m[50003][21];
struct cuv
{
int a,b,c;
long nr;
}c[50003];
int p[21][21][21];

int sortf(const void*a, const void*b)
{cuv *x,*y;
x=(cuv*)a;
y=(cuv*)b;
if(x->a>y->a)return 1;
if(x->a<y->a)return -1;
if(x->b>y->b)return 1;
if(x->b<y->b)return -1;
if(x->c>y->c)return 1;
if(x->c<y->c)return -1;
return strcmp(m[x->nr],m[y->nr]);
}

int comparatie(long inc,long q)
{long i;
for(i=0;i<w;i++)
	if(a[i+inc]!=m[q][i])return 0;
return 1;
}

int main()
{long i,j,ok;
int A,B,C;
f=fopen("abc2.in","r");
fscanf(f,"%s",&a);
fscanf(f,"%s",&m[0]);
w=strlen(m[0]);
for(i=0;i<w;i++)
		if(m[n][i]=='a')c[n].a++;
			else if(m[n][i]=='b')c[n].b++;
				else c[n].c++;
c[0].nr=0;
n=1;
while(!feof(f))
	{
	fscanf(f,"%s",&m[n]);
	for(i=0;i<w;i++)
		if(m[n][i]=='a')c[n].a++;
			else if(m[n][i]=='b')c[n].b++;
				else c[n].c++;
	c[n].nr=n;
	n++;
	}
n-=1;//0->n inclusiv
fclose(f);
qsort(c,n,sizeof(c[0]),sortf);
//for(i=0;i<=n;i++)cout<<c[i].a<<' '<<c[i].b<<' '<<c[i].c<<' '<<m[c[i].nr]<<'\n';
for(A=0;A<=w;A++)
for(B=0;B<=w;B++)
for(C=0;C<=w;C++)p[A][B][C]=-1;
A=c[0].a;
B=c[0].b;
C=c[0].c;
p[A][B][C]=0;
for(i=1;i<=n;i++)
if(A!=c[i].a||B!=c[i].b||C!=c[i].c)
		{
		 A=c[i].a;
		 B=c[i].b;
		 C=c[i].c;
		 p[A][B][C]=i;
		}
A=0;B=0;C=0;
for(i=0;i<w;i++)
	if(a[i]=='a')A++;
		else if(a[i]=='b')B++;
			else C++;
ok=p[A][B][C];
if(ok!=-1)
for(j=ok;c[j].a==A&&c[j].b==B&&c[j].c==C;j++)
	if(comparatie(0,c[j].nr))sol++;
for(i=1;a[i+w-1]!=NULL;i++)
{
if(a[i-1]=='a')A--;
	else if(a[i-1]=='b')B--;
		else if(a[i-1]=='c')C--;
if(a[i-1+w]=='a')A++;
	else if(a[i-1+w]=='b')B++;
		else if(a[i-1]=='c')C++;
ok=p[A][B][C]; ok1=0;
if(ok!=-1)
for(j=ok;c[j].a==A&&c[j].b==B&&c[j].c==C;j++)
	if(comparatie(i,c[j].nr)){ok1=1;sol++;}
   		else if(ok1)break;
}
g=fopen("abc2.out","w");
fprintf(g,"%ld",sol);
fclose(g);
return 0;
}