Cod sursa(job #100674)

Utilizator devilkindSavin Tiberiu devilkind Data 12 noiembrie 2007 16:31:48
Problema Abc2 Scor 100
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.62 kb
#include <stdio.h>

#define NMAX 1000002

long int ATM[NMAX][3],TR[NMAX][3];

long int i,j,k,n,m,nst,dr,len,st,sol;

char s[NMAX*10],cv[NMAX],AC[NMAX];
long int cd[NMAX][3];


void baga_trie(long int nod, long int poz)
{
if (poz>len) {AC[nod]=1;return;}

if (!TR[nod][ cv[poz] ]) TR[nod][ cv[poz] ]=++nst;

baga_trie(TR[nod][ cv[poz] ],poz+1);


}

void baga_atm(long int nod, long int tata,long int x)
{

long int bunic,j;

bunic=ATM[tata][x];
ATM[tata][x]=nod;

if (AC[bunic]) AC[nod]=1;

for (j=0;j<=2;j++)
        if (TR[bunic][j]) ATM[nod][j]=TR[bunic][j];
                else ATM[nod][j]=ATM[bunic][j];

}

int main()
{

freopen("abc2.in","r",stdin);
freopen("abc2.out","w",stdout);

fgets(s,NMAX*10,stdin);

while (fgets(cv,NMAX,stdin))
        {
        if (cv[0]=='\n') break;
        
        for (i=0;(cv[i]>='a')&&(cv[i]<='c');i++)
                cv[i]-='a';

        len=i-1;

        baga_trie(0,0);
        }

dr=0;

for (i=0;i<=2;i++)
        if (TR[0][i])
                {
                cd[++dr][0]=TR[0][i];
                cd[dr][1]=0;
                cd[dr][2]=i;
                }

for (i=1;i<=dr;i++)
        {
        baga_atm(cd[i][0],cd[i][1],cd[i][2]);

        for (j=0;j<=2;j++)
                if (TR[ cd[i][0] ][j]) {
                                        cd[++dr][0]=TR[cd[i][0]][j];
                                        cd[dr][1]=cd[i][0];
                                        cd[dr][2]=j;
                                        }
        }

st=0;

for (i=0;(s[i]>='a')&&(s[i]<='c');i++)
        {
        s[i]-='a';
        st=ATM[st][s[i]];
        if (AC[st]) sol++;
        }

printf("%ld",sol);

return 0;
}