Cod sursa(job #106855)

Utilizator IeewIordache Bogdan Ieew Data 18 noiembrie 2007 23:31:55
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 2.36 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 pa[21][21][21],pb[21][21][21],pc[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;
char d;
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++)pa[A][B][C]=pb[A][B][C]=pc[A][B][C]=-1;
d=m[c[0].nr][0];
A=c[0].a;
B=c[0].b;
C=c[0].c;
if(d=='a')pa[A][B][C]=0;
	else if(d=='b')pb[A][B][C]=0;
		else if(d=='c')pc[A][B][C]=0;

for(i=1;i<=n;i++)
if(A!=c[i].a||B!=c[i].b||C!=c[i].c||d!=m[c[i].nr][0])
		{
		 A=c[i].a;
		 B=c[i].b;
		 C=c[i].c;
		 d=m[c[i].nr][0];
		 if(d=='a')pa[A][B][C]=i;
			else if(d=='b')pb[A][B][C]=i;
				else if(d=='c')pc[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++;
if(a[0]=='a')ok=pa[A][B][C];
	else if(a[0]=='b')ok=pb[A][B][C];
		else ok=pc[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++;break;}
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+w]=='c')C++;
if(a[i]=='a')ok=pa[A][B][C];
	else if(a[i]=='b')ok=pb[A][B][C];
		else ok=pc[A][B][C];
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)){sol++;break;}
}
g=fopen("abc2.out","w");
fprintf(g,"%ld",sol);
fclose(g);
return 0;
}