Pagini recente » Cod sursa (job #1225224) | Cod sursa (job #2175746) | Cod sursa (job #2524947) | Cod sursa (job #2454585) | Cod sursa (job #100392)
Cod sursa(job #100392)
#include<stdio.h>
#include<string.h>
char txt[1000100],cuv[25],*p,*q;
long long int dic[50002],treila[20],aux,nrc;
long int lt,lc,ld,cont,i,ldr;
long long int cton(char *pp);
void swap(long int i1,long int i2);
void heapdown(long int ic,long int nc);
long int cbin(long int L,long int R);
int main()
{
FILE *f,*g;f=fopen("abc2.in","r");g=fopen("abc2.out","w");
fscanf(f,"%s",txt);lt=strlen(txt);
fscanf(f,"%s",cuv);lc=strlen(cuv);
treila[0]=1;
for(i=1;i<lc;i++) treila[i]=3*treila[i-1];
ld=1;dic[ld]=cton(cuv);
while(fscanf(f,"%s",cuv)!=EOF)
{ ld++;dic[ld]=cton(cuv);
}
for(i=ld/2;i>=1;i--) heapdown(i,ld);
for(i=ld;i>=1;i--){swap(1,i);heapdown(1,i-1);}
ldr=1;
for(i=2;i<=ld;i++)
if(dic[i]!=dic[i-1]){ldr++;dic[ldr]=dic[i];}
nrc=cton(txt);
for(i=lc;i<lt;i++)
{
cont+=cbin(1,ldr);
nrc/=3;nrc+=(long long int)(txt[i]-'a')*treila[lc-1];
}
fprintf(g,"%ld\n",cont);
fcloseall();
return 0;
}
long long int cton(char *pp)
{
long long int ret=0;
for(i=0;i<lc;i++)
ret+=(long long int)(pp[i]-'a')*treila[i];
return ret;
}
void swap(long int i1,long int i2)
{
aux=dic[i1];dic[i1]=dic[i2];dic[i2]=aux;
}
void heapdown(long int ic,long int nc)
{
long int is,is1;
is=2*ic;is1=2*ic+1;
if(is>nc)return;
if(is<nc)if(dic[is]<dic[is1])is=is1;
if(dic[ic]<dic[is]){swap(ic,is);heapdown(is,nc);}
}
long int cbin(long int L,long int R)
{
long int M;
if(nrc<dic[L])return 0;
if(nrc>dic[R])return 0;
M=(L+R)/2;
if(nrc==dic[M])return 1;
return cbin(L,M-1)+cbin(M+1,R);
}