Cod sursa(job #99785)

Utilizator razvi9Jurca Razvan razvi9 Data 11 noiembrie 2007 16:23:05
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.85 kb
#include<stdio.h>
#include<string.h>
typedef struct nod {nod* c[3];} nod; 
typedef struct nod2 {nod2* c[3];int n;bool used;} nod2;
nod *p;
nod2* m;
char N[30],M[10000010];
int pi[30];
int i,maxcuv;
long long nr;

//kmp comparare siruri
void PI()
{int k=0,i,n=strlen(N);
 pi[0]=pi[1]=0;
 for(i=1;i<n;i++)
 {while(k>0&&N[k]!=N[i])
   k=pi[k];
  if(N[k]==N[i]) k++;
  pi[i+1]=k;}}
int KMP()
{int n=strlen(N),m=strlen(M),i,k=0,nr=0;
 PI();
 for(i=0;i<m;i++)
 {while(k>0&&N[k]!=M[i])
   k=pi[k];
  if(N[k]==M[i]) k++;
  if(k==n) nr++; }
 return nr;}

nod* new_nod()
{nod *q=new nod;
 q->c[0]=q->c[1]=q->c[2]=0;
 return q;}

//verificare daca cuv exista deja
int new_word()
{int n=strlen(N),i;
 nod *q=p;
 int ok=0;
 for(i=0;i<n;i++)
 {if(!q->c[N[i]-'a'])
  {q->c[N[i]-'a']=new nod;
   (q->c[N[i]-'a'])->c[0]=(q->c[N[i]-'a'])->c[1]=(q->c[N[i]-'a'])->c[2]=0;
   ok=1;}
  q=q->c[N[i]-'a'];}
 return ok;}

void build_arbore_solutii()
{nod2 *q,*t=m;
 int m=strlen(M),i,j;
 for(i=0;i<m;i++)
 {j=0;
  q=t;
  while(j<maxcuv&&i+j<m)
  {if(!q->c[M[i+j]-'a'])
   {q->c[M[i+j]-'a']=new nod2;
    (q->c[M[i+j]-'a'])->c[0]=(q->c[M[i+j]-'a'])->c[1]=(q->c[M[i+j]-'a'])->c[2]=0;
    (q->c[M[i+j]-'a'])->n=0;(q->c[M[i+j]-'a'])->used=0;}
   q=q->c[M[i+j]-'a'];
   q->n=q->n+1;
   j++;}
  }
}
int count()
{int n=strlen(N),i;
 nod2*q=m;
 for(i=0;i<n;i++)
  if(!q->c[N[i]-'a']) return 0;
  else q=q->c[N[i]-'a'];
 if(q->used) return 0;
 q->used=1;
 return q->n;}


int main()
{freopen("abc2.in","r",stdin);
 freopen("abc2.out","w",stdout);
 p=new nod;p->c[1]=p->c[0]=p->c[2]=0;
 m=new nod2;m->c[0]=m->c[1]=m->c[2]=0;
 scanf(" %s ",M);
 while(!feof(stdin))
 {scanf(" %s ",N);
  if(!maxcuv)
  {maxcuv=strlen(N);
   build_arbore_solutii();}
  //if(new_word())
    nr=nr+count();
 }
 printf("%lld",nr);
 fclose(stdout);
 return 0;}